那么,您想在与类型相关的 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
,以上内容尚未编译,这是基于快速阅读 boost 文档。此外,std::function
上面的使用是次优的(您应该能够一直使用模板化函子——哎呀,您可能可以从函子的类型签名中提取类型 T)。