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

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

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

В настоящее время я работаю над проектом, где C ++ 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`?

2

Решение

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

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

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

0

Другие решения

Других решений пока нет …