1

単体テスト内で boost::variant の型を繰り返し処理したいと考えています。これは次のように行うことができます。

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

function はファンクターです。特定の操作が、バリアント内の 1 つのタイプに対して他のすべてのタイプとは異なる方法で行われるようにしたいだけです。しかし、テストが別の関数で行われるようになったのは好きではありません。また、ファンクターから MyTest のメンバーにアクセスしたい場合はどうすればよいでしょうか? それは本当に厄介なようです。

より良いアプローチに関する提案はありますか?

4

1 に答える 1

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 を抽出できます)。

于 2012-10-31T03:43:36.693 に答える