使用boost :: phoenix来适应BOOST_CHECK宏

时间:2012-11-07 11:37:28

标签: c++ boost c++11 boost-test boost-phoenix

在使用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的基本用法来创建lambdas,但我想不出能够创建一个能够调用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?

1 个答案:

答案 0 :(得分:0)

宏总是先扩展,所以获得正确行号的唯一方法是:

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

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