如何在任何容器上进行宏工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在任何容器上进行宏工作?相关的知识,希望对你有一定的参考价值。

我有以下代码,我正在使用宏来检查向量中是否存在元素。

#define x.contains(a) x.find(a)!=x.end()
void main(){
     vector<int> v = {1,2,3,4};
     if(v.contains(2))
         cout<<"yes"<<endl;
     else
         cout<<"no"<<endl;
}

但在编译时它会出现以下错误:

ISO C++11 requires whitespace after the macro name #define x.contains(a) x.find(a)!=x.end()

请告诉我一个出路。谢谢。

答案

宏不再是解决方案了。

如果你想要朝这个方向努力,你需要让你的宏看起来像一个函数而不是一个成员函数,并且还使用唯一的括号来避免与运算符优先级相关的意外影响:

#define contains(x,a) ((x).find(a)!=(x).end())

但是如果你这样做,很遗憾不使用C ++模板而不是宏。例如:

template <class T, class U> 
bool contains (const T& x, U a) {
    return x.find(a)!=x.end();
}

模板优于宏的一个巨大优势是可以定义特化。然后编译器选择最合适的实现。例如,宏版本和我之前的示例都不能与<list>一起使用,因为没有find()成员函数。但是使用模板,您可以定义更专业的版本:

template <class U>
bool contains (const list<U>& x, U a) {
    return std::find(x.begin(), x.end(), a)!=x.end();
}

Online demo

以上是关于如何在任何容器上进行宏工作?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Android Studio - setContenView - 绑定(片段)

运行 share/scripts/javascript 命令行宏

Android:使用 putExtra 从片段访问容器活动对象?

如何在 Android 中的特定片段容器中显示片段

如何在 Android 工作室中从现有活动创建片段

如何在对话框中用容器视图替换片段