Использование boost::phoenix для адаптации макроса BOOST_CHECK

Во время тестирования при использовании С++ 11 я использовал следующую конструкцию:

std::for_each( coll.begin(), coll.end(), 
    [ &obj, expRes ]( const value_type& val )
    {
       BOOST_CHECK_EQUAL( expRes, obj.someFunc( val ) );
    } );

В настоящее время я работаю над проектом, в котором С++ 11 не используется, и я ищу способ сгенерировать аналогичное лямбда-выражение без необходимости создавать отдельную функцию/функтор.

Я понимаю базовое использование boost::phoenix для создания лямбда-выражений, но я не могу придумать способ создания лямбда-фэникса, способного вызывать макрос boost::test.

Лучшее, что я могу придумать, это:

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»?


person mark    schedule 07.11.2012    source источник


Ответы (1)


Макросы всегда раскрываются первыми, поэтому единственный способ получить правильный номер строки:

  • не вставлять макросы в шаблоны
  • или извлеките любые __LINE__, __FILE__ или другие контекстно-зависимые макросы из тела шаблона, превратив их в параметры шаблона, и оберните выражение верхнего уровня (макрос или шаблон) макросом, используя эти извлеченные значения.

Вероятно, не так сложно реорганизовать код boost для включить эти модификации (около 4 уровней вложенного кода), но впоследствии это будет нелегко поддерживать.

person didierc    schedule 07.11.2012
comment
возможно, это можно считать ошибкой в ​​​​библиотеке повышения? - person didierc; 07.11.2012
comment
к сожалению, ручное расширение (или частичное расширение) макросов BOOST_TEST не приближает меня к лямбда-выражению С++ 11. Я хотел бы вообще избавиться от отдельной функции шаблона. - person mark; 07.11.2012
comment
извините, я думал, что ваша проблема была в неправильном местоположении ошибки, сообщаемом тестовым макросом. Боюсь, вы не получите лямбду С++ 11 без С++ 11, макросы не могут заменить эту функцию. - person didierc; 07.11.2012