比较c ++宏的输入参数

时间:2016-08-08 06:35:35

标签: c++ macros

我有一个这样的宏:

#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:忘记模板

请不要建议使用模板。这是更大解决方案的一部分。解决方案的这一小部分可以通过模板解决,但更大的解决方案必须通过宏来解决。因此,请发布与宏相关的的答案,而不是模板。

3 个答案:

答案 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>();
}

结果:

  

空隙!

     

不是无效!

Live Demo

答案 2 :(得分:-1)

哟不能这样做。 不是类型安全的。这是int操作的宏定义,不能接受float等其他数据。它们的解释没有类型检查。

因此,您可以使用模板功能。