3

c++ 11 を使用する場合のテスト中に、次の構成を使用しました。

std::for_each( coll.begin(), coll.end(), 
    [ &obj, expRes ]( const value_type& val )
    {
       BOOST_CHECK_EQUAL( expRes, obj.someFunc( val ) );
    } );

私は現在、C++11 が使用されていないプロジェクトに取り組んでおり、別の関数/ファンクターを作成することなく、同様のラムダ式を生成する方法を探しています。

ラムダを作成するための の基本的な使用法は理解していますが、マクロboost::phoenixを呼び出すことができるフェニックス ラムダを作成する方法が思いつきません。boost::test

私が思いつくことができる最高のものは次のとおりです。

template< typename T >
void MakeCheck( const T& lhs, const T& rhs )
{
    BOOST_CHECK_EQUAL( lhs, rhs );
}


/// inside some other function...
std::for_each( coll.begin(), coll.end(), 
    ph::bind( MakeCheck<bool>, true, 
              ph::bind( &MyClass::someFunc, obj, ph::arg_names::arg1 ) ) );

残念ながら、マクロ BOOST_CHECK_EQUAL はstd::for_each呼び出しの行番号ではなく、マクロの行番号を報告するため、このアプローチでは失敗したチェックの行番号情報が失われます。

「boost::phoenix」を使用したマクロ呼び出しを含むラムダを作成するより良い方法はありますか?

4

1 に答える 1

1

マクロは常に最初に展開されるため、正しい行番号を取得する唯一の方法は次のとおりです。

  • テンプレートにマクロを埋め込まない
  • または__LINE__、 、__FILE__、またはその他の状況依存マクロをテンプレート パラメーターに変換してテンプレート本体から抽出し、これらの抽出された値を使用するマクロで最上位の式 (マクロまたはテンプレート) をラップします。

これらの変更 (ネストされたコードの約 4 レベル) を含めるようにブーストコードをリファクタリングすることはおそらくそれほど難しくありませんが、その後の保守は容易ではありません。

于 2012-11-07T13:12:52.800 に答える