开发者

pass method with template arguments to a macro

开发者 https://www.devze.com 2023-02-01 01:52 出处:网络
I am unable to use Google Test\'s ASSERT_THROW() macro in combination with multiple template arguments. Consider that I want to make sure that construction of Matrix<5,1> throws:

I am unable to use Google Test's ASSERT_THROW() macro in combination with multiple template arguments. Consider that I want to make sure that construction of Matrix<5,1> throws:

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

(this example doesn't make a lot of sense, of course t开发者_Go百科his shoud not throw, but it is what stayed after simplifying what I had.)

I get this output from MS VC++ 2008:

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

Whereas there are no problems with:

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

How can I overcome this problem?

Thanks!


the problem is the extra comma, you will need to protect it from the macro. Try

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


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

Edit: @tletnes answer is simpler, however this one will work even if the macro parameter used as a non-expression. For example:

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

More edit: The macro COMMA is already defined in 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) { }


#define COMMA , may not compile in GCC. Use #define COMMA() , instead. Why can't I add comment to other's post?


In addition to the answers posted, you could also try

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

So that the preprocessor doesn't get confused by the comma.

0

精彩评论

暂无评论...
验证码 换一张
取 消