【问题标题】:pass method with template arguments to a macro将带有模板参数的方法传递给宏
【发布时间】:2011-05-28 15:58:22
【问题描述】:

我无法将 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);

我该如何克服这个问题?

谢谢!

【问题讨论】:

标签: c++ macros googletest


【解决方案1】:
#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) { }

【讨论】:

  • BOOST_PP_COMMA() 在各种情况下似乎比其他方法更可靠。感谢您的提示!
【解决方案2】:

问题是多余的逗号,您需要保护它免受宏的影响。试试

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

【讨论】:

  • 这只有在Matrix&lt;5,1&gt;() 在表达式中使用时才有效......所以它在这里有效并且比我的更简单。 +1
  • 在宏中保护逗号的所有东西到底是什么?现在我知道括号(1,1)(来自这个答案)和双引号"1,1"(来自测试)。哪里/什么是完整列表?
  • 这是在 C 标准中定义的(我的 C99 草案副本的第 6.10.3 节):由最外面的匹配括号界定的预处理标记序列形成函数的参数列表- 类似宏。列表中的各个参数由逗号预处理标记分​​隔,但匹配内括号之间的逗号预处理标记不分隔参数。如果在参数列表中存在预处理标记序列,否则它们将充当预处理指令,150) 行为未定义。
【解决方案3】:

#define COMMA ,可能无法在 GCC 中编译。 改用 #define COMMA() 。 为什么我不能给别人的帖子添加评论?

【讨论】:

  • 好点,谢谢。添加 cmets 需要一些声誉。
  • 已检查。在 G++ 中运行良好。据我所知,它甚至是标准的。
  • 如果在复杂的宏中使用简单的 COMMA,例如 REPEAT,它不会在 GCC 上编译。 boost 库也使用 COMMA()。参见 boost/preprocessor/punctuation/comma.hpp。我用过COMMA,不是在mingw32-g++.exe 4.4.0上编译
  • PS:对于简单的使用,比如你的另一个回复,它可能工作正常。但是当简单的 COMMA 不能在复杂的宏中编译时,我真的感到很头疼。 :-)
  • @wqking: 请回复@prefix of user name,否则我不知道你回复了一个月后发现boost/preprocessor/punctuation/comma.hpp,来这里编辑我的帖子,发现你已经写了.啊……
猜你喜欢
  • 1970-01-01
  • 2016-09-30
  • 2012-02-15
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多