所以,你想調用一個函數在一個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)。
lambda? – BigBoss
我需要與C++ 98兼容 – Baz