タイプ依存の 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 を抽出できます)。