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

标签 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 的基本用法创建 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/

相关文章:

c++ - Objective-C++ 将 std::string 转换为 NSString

c++ - std::string 在不应该的时候通过了 std::is_fundamental 检查 - 模板元编程

c++ - 使用 boost 的 program_options 时,如何确保声明在 C++ 中具有存储类或类型说明符?

c++ - STL 容器和大量数据

c++ - 为什么重复使用条件变量的互斥量会导致死锁?

c++ - 集合类型的可变长度参数列表

c++ - 如何在文件中写入动态分配的 2D 'array'?

c++ - 是否可以模板化 basic_string<>::iterator?

c++ - 限制 boost::odeint 集成中的步骤数

c++ - boost scoped_lock 返回行为