使用boost ::凤来适应BOOST_CHECK宏观
问题描述:
在测试过程中使用C++ 11的时候我用下面的结构:使用boost ::凤来适应BOOST_CHECK宏观
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__
,或其他上下文敏感的宏通过将它们转换为模板参数并使用这些提取的值用宏包装顶层表达式(宏或模板)来从模板体中获取。
重构提升code以包含这些修改(大约4级嵌套代码)可能并不困难,但之后将不容易维护。
也许这可能被认为是助推库中的一个错误? – didierc
不幸的是,手动扩展(或部分扩展)BOOST_TEST宏并没有让我更接近C++ 11 lambda表达式。我想摆脱完全独立的模板功能。 – mark
对不起,我认为你的问题是由测试宏报告错误的错误位置。我担心如果没有C++ 11,你不会得到C++ 11 lambda,宏不能替代该特性。 – didierc