在使用 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?
最佳答案
宏总是首先展开,所以获得正确行号的唯一方法是:
- 不在模板中嵌入宏
- 或从模板主体中提取任何
__LINE__
、__FILE__
或其他上下文相关的宏,方法是将它们转换为模板参数并包装顶级表达式(宏或模板)使用使用这些提取值的宏。
重构 boost 可能并不难 code包括这些修改(大约 4 层嵌套代码),但之后维护起来并不容易。
关于c++ - 使用 boost::phoenix 适配 BOOST_CHECK 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13268978/