请参阅以下代码,我希望宏“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;
}
答案 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))