【问题标题】:Joining first n-1 arguments in macro在宏中加入前 n-1 个参数
【发布时间】:2018-07-06 16:32:04
【问题描述】:

我需要编写一个如下所示的宏

MACRO(one, name, "some string");

如果宏有 n 个参数,我需要能够将第一个 n-1 参数与下划线连接在一起。例如,上面的调用将扩展为

std::string one_name{"some string"};

同样,如果我有这样的事情

MACRO(one, two, name, "some string");

我应该得到

std::string one_two_name{"some string"};

这可能吗?


免责声明:我不能不为此使用宏。

【问题讨论】:

  • 也许你应该考虑制作一个工具,从一些简单的输入文件中自动生成你想要的代码?或者可能重新考虑您的需求、分析和设计,这似乎迫使您做类似的事情?
  • 您可以查看Boost.Preprocessor
  • 如果您解释了您实际上试图解决的问题,也许会有所帮助
  • @alterigel 我正在尝试将变量名称附加到彼此,并检查名称是否与声明变量的命名空间顺序相对应。例如,如果宏在 @987654327 @ 我想声明一个名为a_b_name 的变量作为宏扩展的一部分,并检查::a::b::a_b_name 是否有效(以及static_assert 是否有效)
  • 不这么认为,不。 n 的最大值是多少?

标签: c++ macros declaration


【解决方案1】:

使用硬编码限制,您可以这样做:

#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...)    N
#define COUNT(...)   COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/

#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))

#define F_1(_) static_assert(false, "Not enough argument")
#define F_2(a, s) std::string a = s;
#define F_3(a, b, s) std::string a ## _ ## b = s;
#define F_4(a, b, c, s) std::string a ## _ ## b ## _ ## c= s;
#define F_5(a, b, c, d, s) std::string a ## _ ## b ## _ ## c ## _ ## d= s;
#define F_6(a, b, c, d, e, s) std::string a ## _ ## b ## _ ## c ## _ ## d ## _ ## e = s;
#define F_7(a, b, c, d, e, f, s) std::string a ## _ ## b ## _ ## c ## _ ## d ## _ ## e ## _ ## f= s;
#define F_8(a, b, c, d, e, f, g, s) std::string a ## _ ## b ## _ ## c ## _ ## d ## _ ## e ## _ ## f ## _ ## g = s;

#define DISPATCH(N) F_ ## N

#define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)

Demo

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 2018-08-25
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多