有没有办法在C ++中定义MACRO来生成按输入类型区分的内容?

时间:2014-08-30 14:50:33

标签: c++ macros

请参阅以下代码,我希望宏“bar”可以预编译到评论显示的内容。

#define bar(x) if(x is int) foo_int(x); else if (x is float) foo_float; else (x);

int main()
{
    bar(123); // -> foo_int(123);
    bar(1.0f); // -> foo_float(1.0f);
    bar(false); // -> false;
}

2 个答案:

答案 0 :(得分:4)

宏是这项工作(以及大多数其他工作)的错误工具。您可以使用模板执行此操作,对于需要特殊处理的任何类型进行重载:

template <typename T> T bar(T x) {return x;}  // generic template
int bar(int x) {return foo_int(x);}           // overload for int
float bar(float x) {return foo_float(x);}     // overload for float

答案 1 :(得分:2)

在C ++ 14中,只需:

auto bar(int i) { return foo_int(i); }
auto bar(float f) { return foo_float(f); }
template <typename T>
auto bar(T&& t) { return std::forward<T>(t); }

在C ++ 11中

#define Return(x) decltype(x) {return x;}

auto bar(int i) -> Return(foo_int(i))
auto bar(float f) -> Return(foo_float(f))
template <typename T>
auto bar(T&& t) -> Return(std::forward<T>(t))