передать метод с аргументами шаблона в макрос - PullRequest
20 голосов
/ 21 декабря 2010

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

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

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

Я получаю этот вывод из MS VC ++ 2008:

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

Тогда как нет проблем с:

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

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

Спасибо!

Ответы [ 3 ]

19 голосов
/ 21 декабря 2010

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

ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
19 голосов
/ 21 декабря 2010
#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) { }
7 голосов
/ 21 декабря 2010

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

...