2012-01-19 67 views
1

在理想的情況下檢索值,我想用ClassVariant以下列方式:使用的`的boost :: variant`來存儲和不通過類型信息

// store & retrieve int 
    map<string, ClassVariant> mapValues; 
    mapValues["int_fieldX"] = ClassVariant(20); 
    int fieldX = (mapValues["int_fieldX"])(); 
    // Or int fieldX = (mapValues["int_fieldX"]); 

不過,我可以只實現下面的代碼需要檢索語句如下喂類型信息:

int fieldB = (mapValuesTwo["int_fieldB"])(int(0)); 

正如你可以看到int(0)提供類型信息。有沒有辦法可以消除這個限制。所以不需要類型信息。

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <map> 
#include <boost/variant.hpp> 

using namespace std; 

typedef boost::variant<int, double, string> VarIntDoubleString; 

class ClassVariant 
{ 
public: 
    ClassVariant() : m_value(int(0)) {} 
    ClassVariant(VarIntDoubleString _val) : m_value(_val) {} 

    template<typename T> 
    T operator()(const T&) const 
    { 
    return boost::get<T>(m_value); 
    } 

private: 
    VarIntDoubleString m_value; 
}; 

int main(void) 
{ 
    map<string, ClassVariant> mapValuesTwo; 

    // store & retrieve int 
    mapValuesTwo["int_fieldB"] = ClassVariant(20); 
    int fieldB = (mapValuesTwo["int_fieldB"])(int(0)); 
    cout << "fieldB: " << fieldB << endl; 

    // store & retrieve string 
    mapValuesTwo["int_fieldD"] = ClassVariant("Hello world"); 
    string fieldD = (mapValuesTwo["int_fieldD"])(string("")); 
    cout << "fieldD: " << fieldD << endl; 
} 

// Output 
fieldB: 20 
fieldD: Hello world 

回答

1

你不能這樣做,模板參數推導只適用於參數,而不適用於函數的返回值。你最好的選擇是溝通operator()的正常功能,如get<T>()。我不能指出標準中的相關行,但對我來說太模糊了。

注意:如果這樣的事情是可能的,我猜測boost :: variant已經有get函數,其中T不需要。

編輯:看到這個question

0

你應該一起使用boost ::變種與訪問者在其訪問的價值。見here