将模板参数传递给宏的方法

时间:2010-12-21 06:42:52

标签: c++ macros googletest

我无法将Google Test的ASSERT_THROW()宏与多个模板参数结合使用。考虑一下,我想确保构造Matrix<5,1>抛出:

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 个答案:

答案 0 :(得分:19)

#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) { }

答案 1 :(得分:19)

问题是额外的逗号,你需要保护它免受宏的影响。试试

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

答案 2 :(得分:7)

#define COMMA,可能无法在GCC中编译。 请改用#define COMMA()。 为什么我不能在其他帖子上添加评论?