gpt4 book ai didi

c++ - 使用 boost::phoenix 适配 BOOST_CHECK 宏

转载 作者:太空狗 更新时间:2023-10-29 23:07:17 31 4
gpt4 key购买 nike

在使用 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com