2012-10-30 66 views
1

我想在我的單元測試中遍歷boost :: variant類型。這可以按如下方式完成:Google測試和boost :: variant

TEST_F (MyTest, testExucutedForIntsOnly) 
{ 
    typedef boost::variant<int, char, bool, double> var; 
    boost::mpl::for_each<SyntaxTree::Command::types>(function()); 
    ... 
} 

其中函數是一個仿函數。我只是想確保一個特定的操作對於其他類型的變體發生不同的變化。但是,我不喜歡現在在另一個函數中完成測試 - 如果我想從functor訪問MyTest的成員,該怎麼辦?看起來很混亂。

有關更好方法的任何建議?

+1

lambda? – BigBoss

+0

我需要與C++ 98兼容 – Baz

回答

0

所以,你想調用一個函數在一個boost :: variant類型依賴?

試試這個:

template<typename T> 
struct RunOnlyOnType_Helper 
{ 
    std::function<void(T)> func; 
    template<typename U> 
    void operator()(U unused) {} 
    void operator()(T t) { func(t); } 
    RunOnlyOnType_Helper(std::function<void(T)> func_):func(func_){} 
}; 

template<typename T, typename Variant> 
void RunOnlyOnType(Variant v, std::function< void(T) > func) 
{ 
    boost::apply_visitor(RunOnlyOnType_Helper<T>(func), v); 
} 

的想法是,RunOnlyOnType是需要一個變種,並從該變體的特定類型的仿函數的函數,並執行函子當且僅當變體的類型匹配仿函數。

然後,你可以這樣做:

typedef boost::variant<int, char, bool, double> var; 
var v(int(7)); // create a variant which is an int that has value 7 
std::string bob = "you fool!\n"; 
RunOnlyOnType<int>(v, [&](int value)->void 
{ 
    // code goes here, and it can see variables from enclosing scope 
    // the value of v as an int is passed in as the argument value 
    std::cout << "V is an int with value " << value << " and bob says " << bob; 
}); 

這是你想要的嗎?

免責聲明:我以前從未碰過boost::variant,以上內容尚未編譯,這是基於快速閱讀助推文檔。另外,上面的std::function的使用是次優的(你應該能夠一直使用模板仿函數 - 嘿,你可以從仿函數的類型簽名中提取類型T)。

+0

我需要與C++ 98兼容,所以我不能使用lambdas :( – Baz