2012-08-29 58 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這裏解析爲一個類型,你可以在編譯時並不只是改變。