我有一个这样的宏:
#define M(x)
我想检查x,如果它等于void
。这样的事情:
#define M(x)
if(x == void)
do not return anything
else
print a output
问题是x
可能是什么。可以使用任何参数调用M.
薄荷)
M(串)
M(空隙)
我希望这个宏可以检测输入参数是void
。
更新1:更好地解释
这是一个功能创建者宏。就像那样(简单代码)
#define M(ret, name) \
ret name(){ \
ret r = callOtherFunc(); \
return r; \
}
我想如果ret无效,那么'return ...'行被移除
更新2:忘记模板
请不要建议使用模板。这是更大解决方案的一部分。解决方案的这一小部分可以通过模板解决,但更大的解决方案必须通过宏来解决。因此,请发布与宏相关的仅的答案,而不是模板。
答案 0 :(得分:2)
#define M(x) std::is_same<x,void>::value
在预处理阶段之后,void
的检查会发生。虽然上面是正确的方法,但我可能不会在实际代码中做。但是,您还没有完全了解您的确切需求。因此,我将此作为答案。
更新1 :您似乎想要使用宏创建功能。而那些只为void
类型提供错误,因为对象无法返回void
的对象。这是你应该怎么做的:
#define M(ret, name) \
ret name(){ \
return callOtherFunc(); \ // not storing in temporary
}
Demo。
但我仍然感觉到,你可能想要更多东西。因此,尝试提供一个包含所有想要的可验证的示例。
答案 1 :(得分:0)
另一种选择是使用模板:
template <typename T> void M(){
if(std::is_same<T,void>::value){
std::cout << "void!\n";
}
else{
std::cout <<"Not void!\n";
}
}
int main(){
M<void>();
M<int>();
}
结果:
空隙!
不是无效!
答案 2 :(得分:-1)
int
操作的宏定义,不能接受float
等其他数据。它们的解释没有类型检查。
因此,您可以使用模板功能。