将需要逗号的模板传递给单参数宏
Passing a template which requires a comma to a single-argument macro
我有一些代码基本上可以浓缩为
#define FOO(a)
FOO(std::map<int, int>);
但它会发出编译错误(宏FOO
的实际参数太多)。
显然预处理器认为我已经提供了 std::map<int
和 int>
作为参数。
有办法解决这个问题吗?预处理器不会以这种方式处理带引号的字符串。
理想情况下,这应该是注释,但 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>));
我有一些代码基本上可以浓缩为
#define FOO(a)
FOO(std::map<int, int>);
但它会发出编译错误(宏FOO
的实际参数太多)。
显然预处理器认为我已经提供了 std::map<int
和 int>
作为参数。
有办法解决这个问题吗?预处理器不会以这种方式处理带引号的字符串。
理想情况下,这应该是注释,但 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>));