我想编写C++宏服用任意参数,如:C++微距文本操作
#define MANIP(...) \
//Implementation
这样写
MANIP(m_a, m_b, m_c);
扩展到
f(a, b, c);
g("a", "b", "c");
这可能吗?
预先感谢您帮助我与这个看似奢侈的问题:)
我想编写C++宏服用任意参数,如:C++微距文本操作
#define MANIP(...) \
//Implementation
这样写
MANIP(m_a, m_b, m_c);
扩展到
f(a, b, c);
g("a", "b", "c");
这可能吗?
预先感谢您帮助我与这个看似奢侈的问题:)
我不相信会有一个简单的方法可以从m_a
到a
。但是,字符串运算符#
是标准C和C++的一部分。给定
#define STRING(x) #x
然后STRING(m_a)
例如,将被转换到"m_a"
。
这不是真的有可能有预处理器(这是什么处理的#define语句,而不是C++编译器本身)将参数分解成多个部分。因此,如果您尝试从m_a中提取a,则无法执行此操作。相反,它会是更好地界定喜欢你的宏:
#define MANIP(m, a, b, c)
,并要求“M”是一个独立的输入。其次,您不能轻松地将非字符串输入转换为字符串输入。 IE,从a转换为“a”不容易实现。我是这样说的,因为我知道一些CPP(C-Pre-processor)可以做到这一点。但我不认为它是可移植的。
通常,当您尝试做复杂的事情时,您应该使用编程语言而不是CPP来编写。
具体来说,在C++中,您可以使用模板来获得比CPP的#define语句更多的工作。
预处理器无法分割令牌。这意味着不可能从m_foo
或(最近已被要求)foo
从"foo"
生产foo
。
如果您可以使用可变宏(正如Matthieu M.指出的那样,这意味着C99或C++ 0x),Jens Gustedt的P99 library在这里会有所帮助。有宏可以使这更容易,但是让我们使不熟悉库的人可读,好吗?
简体案例:可以传递两个或三个参数。
#define MANIP2(a, b) \
f(a, b) \
g(#a, #b)
#define MANIP3(a, b, c) \
f(a, b, c) \
g(#a, #b, #c)
#define MANIP(...) \
MANIP_( \
P99_PASTE2(MANIP, P99_NARG(__VA_ARGS__)), \
__VA_ARGS__) \
#define MANIP_(MANIPMAC, ...) MANIPMAC(__VA_ARGS__)
这说明了基本原理。在实践中,有一些foreach风格的宏(类似于Boost的)使它更容易编码(虽然,正如我所提到的,对于外行来说更难以阅读)。详细信息请参见P99 library documentation。
您想从“m_a”中删除“m”吗? – Nawaz 2011-01-28 19:41:21
我想你会发现很难从宏参数中去掉前导m_。但宏和C++是他们是什么,我不愿意说“不可能”... – 2011-01-28 19:41:34