我坐在一些遗留代码上,通过#defines生成大量代码。现在我知道#ifdef
内部#define
不可能,#if
可能吗?我想为特定类型添加一些特化。 (没有像使用模板那样进行重大更改)。以下示例给出了隐秘错误,因此不是这样的:
#define MK_GET(type) \
type get_ ## type (int index) \
{ \
#if type == double \ <-- what i want to add
specialized code... \
#endif
...
} \
MK_GET(double);
MK_GET(int);
MK_GET(string);
答案 0 :(得分:7)
您可以使用模板实现这一目标:
template<typename T>
struct getter
{
T operator()(int index)
{
// general code
}
};
template<>
struct getter<double>
{
T operator()(int index)
{
// specialized code
}
};
#define CAT(a, b) a ## b
#define MK_GET(type) type CAT(get_, type) (int index) getter<type>()(index)
答案 1 :(得分:0)
为什么你不这样写:
#if (type == double)
#define MK_GET some code
#else
#define MK_GET same code with changes
#endif
答案 2 :(得分:0)
#if
无法嵌套在#define
内。当这是更好的选择时,为什么要避免template
s。它们是安全且“可编辑”的(未经过预处理)。
答案 3 :(得分:0)
预处理器是一个传递过程,因此您无法在宏定义内部放置宏定义。唯一的方法是通过模板界面。