Во время тестирования при использовании 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`?
Макросы всегда сначала раскрываются, поэтому единственный способ получить правильный номер строки — это:
__LINE__
, __FILE__
или другие контекстно-зависимые макросы из тела шаблона, превратив их в параметры шаблона и обернув выражение верхнего уровня (макрос или шаблон) макросом, используя эти извлеченные значения.Вероятно, это не так сложно, чтобы реорганизовать повышение код включить эти модификации (около 4 уровней вложенного кода), но это будет нелегко поддерживать впоследствии.
Других решений пока нет …