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)