在使用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?
答案 0 :(得分:0)
宏总是先扩展,所以获得正确行号的唯一方法是:
__LINE__
,__FILE__
或其他上下文相关宏,方法是将它们转换为模板参数,并使用这些提取的宏包装顶级表达式(宏或模板)值。重构boost code以包含这些修改(大约4级嵌套代码)可能并不那么困难,但之后的维护并不容易。