将需要逗号的模板传递给单参数宏

Passing a template which requires a comma to a single-argument macro

我有一些代码基本上可以浓缩为

#define FOO(a)
FOO(std::map<int, int>);

但它会发出编译错误(宏FOO的实际参数太多)。

显然预处理器认为我已经提供了 std::map<intint> 作为参数。

有办法解决这个问题吗?预处理器不会以这种方式处理带引号的字符串。

理想情况下,这应该是注释,但 SO 不支持注释中的代码,因此,您可以

#include <map>

#define T_ARGS( ... ) < __VA_ARGS__ >

#define FOO( a )  a x;

auto main() -> int
{
    FOO( std::map T_ARGS( int, int ) );
    (void) x;
}

或者您可以定义一个解析为逗号的宏,或者您可以使用任何特定于特定用例的方案(例如,单独传递模板名称)。

预处理器只会将未加括号的逗号视为宏参数分隔符。所以你可以做的是将 std::map<int, int> 重写成带有括号的东西。一个简单的可能是 decltype(std::map<int, int>()).

comma is being treated as a macro argument seperator,括号内没有逗号。

如果您使用的是 Boost,他们提供 BOOST_PP_COMMA:

#include <boost/preprocessor/punctuation/comma.hpp>

#define FOO(a)
FOO(std::map<int BOOST_PP_COMMA int>);

您也可以定义自己的:

#define COMMA ,
FOO(std::map<int COMMA int>);

只需添加一组额外的括号:

#define FOO(a)
FOO((std::map<int, int>));