2012-08-29 59 views
0

我试图编译使用GCC 4.7.1与-std=c++11标志设置如下:使用自动作为模板参数

std::map<std::string, auto> myMap; 

我试图创建一个对象包含大量的JSON各种类型的数据(int string,bool)以及子结构(list,map),所以我不能在编译时声明字段值的类型,所以我想我会使用auto关键字。

然而,当我尝试编译它,我得到以下

error: invalid use of ‘auto’ 
error: template argument 2 is invalid 
error: template argument 4 is invalid 
error: unable to deduce ‘auto’ from ‘<expression error>’ 

是否有使用auto作为模板参数一种特殊的方式,或只是不可能?

+4

编号检出Boost.Variant或Boost.Any。 –

+9

'auto'关键字仍然不允许将C++用作动态语言:D – fasked

回答

7

我认为你在找什么是boost::any

std::map<std::string, boost::any> myMap; 

auto在编译期间评估,不能用作动态运行时类型。

+7

['boost :: variant'](http://www.boost.org/doc/libs/1_51_0/doc/html/variant。 html)对于JSON来说是一个更好的建议,因为JSON数据结构可以拥有的数量非常有限。 –

3

这根本不可能。 auto后面的类型必须从某些东西中推导出来。最接近你可以使用decltype与一些表达式。

std::map<std::string, decltype(some expression)> myMap; 

decltype这里解析为一个类型,你可以在编译时并不只是改变。