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 的项目,我是否正在寻找一种方法来生成类似的 lambda 表达式,而不必创建单独的函数/仿函数。

我了解boost::phoenix创建 lambda 的基本用法,但我想不出一种方法来创建能够调用boost::test宏的 phoenix lambda。

我能想到的最好的是:

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”的宏调用的 lambda?

4

1 回答 1

1

宏总是首先展开,因此获得正确行号的唯一方法是:

  • 不在模板中嵌入宏
  • 或从模板主体中提取任何__LINE__,__FILE__或其他上下文相关的宏,方法是将它们转换为模板参数,并使用这些提取的值用宏包装顶级表达式(宏或模板)。

重构 boost代码以包含这些修改(大约 4 级嵌套代码)可能并不难,但之后维护起来并不容易。

于 2012-11-07T13:12:52.800 回答