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

Phi*_*ipp 20 c++ macros googletest

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

ASSERT_THROW(Matrix<5,1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)

(这个例子没有多大意义,当然这不应该抛出,但它是在简化我所拥有的之后留下的.)

我从MS VC++ 2008获得此输出:

warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'
Run Code Online (Sandbox Code Playgroud)

虽然没有问题:

ASSERT_THROW(Matrix<1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)

我怎样才能克服这个问题?

谢谢!

ybu*_*ill 19

#define COMMA ,
ASSERT_THROW(Matrix<5 COMMA 1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)

编辑: @tletnes答案更简单,但即使宏参数用作非表达式,这个也会起作用.例如:

BOOST_FOREACH(std::pair<int COMMA int>& v, myVec) { } // works
BOOST_FOREACH((std::pair<int, int>)& v, myVec) { } // fails
Run Code Online (Sandbox Code Playgroud)

更多编辑:宏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) { }
Run Code Online (Sandbox Code Playgroud)


tle*_*nes 19

问题是额外的逗号,你需要保护它免受宏.尝试

ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于表达式中使用的`Matrix <5,1>()`所以它在这里工作并且比我的更简单.+1 (3认同)

小智 7

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