Подтвердить что ты не робот

Передать метод с аргументами шаблона макросу

Я не могу использовать макрос Google Test ASSERT_THROW() в сочетании с несколькими аргументами шаблона. Подумайте, что я хочу, чтобы конструкция Matrix<5,1> выбрала:

ASSERT_THROW(Matrix<5,1>(), std::runtime_error);

(этот пример не имеет большого смысла, конечно, это не бросать, но это то, что осталось после упрощения того, что у меня было.)

Я получаю этот вывод от MS VС++ 2008:

warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'

В то время как нет проблем с:

ASSERT_THROW(Matrix<1>(), std::runtime_error);

Как я могу решить эту проблему?

Спасибо!

4b9b3361

Ответ 1

проблема заключается в дополнительной запятой, вам нужно будет защитить ее от макроса. Попробуйте

ASSERT_THROW((Matrix<5,1>()), std::runtime_error);

Ответ 2

#define COMMA ,
ASSERT_THROW(Matrix<5 COMMA 1>(), std::runtime_error);

Изменить: ответ @tletnes проще, но этот будет работать, даже если параметр макроса используется как не-выражение. Например:

BOOST_FOREACH(std::pair<int COMMA int>& v, myVec) { } // works
BOOST_FOREACH((std::pair<int, int>)& v, myVec) { } // fails

Больше прав: Макрос COMMA уже определен в boost:

#include <boost/preprocessor/punctuation/comma.hpp>
ASSERT_THROW(Matrix<5 BOOST_PP_COMMA() 1>(), std::runtime_error);
BOOST_FOREACH(std::pair<int BOOST_PP_COMMA() int>& v, myVec) { }

Ответ 3

#define COMMA, не может компилироваться в GCC. Вместо этого используйте #define COMMA(). Почему я не могу добавить комментарий к другому сообщению?