模拟python';s";在;在C++;

模拟python';s";在;在C++;,python,c++,templates,operator-overloading,Python,C++,Templates,Operator Overloading,我像python中一样设法弄清楚了确切的语法(检查值是否存在于容器中),所以您可以只检查值是否“存在于”支持begin()/end()方法的任何容器中 以下是我的实现: #include <algorithm> #include <iostream> #include <vector> template<class T> struct specified { specified(T const& value) : value_(v

我像python中一样设法弄清楚了确切的语法(检查值是否存在于容器中),所以您可以只检查值是否“存在于”支持
begin()
/
end()
方法的任何容器中

以下是我的实现:

#include <algorithm>
#include <iostream>
#include <vector>

template<class T>
struct specified {
    specified(T const& value) : value_(value) {}
    T value_;

    template<class Container>
    bool operator * (Container const& cont) {
        return (std::find(cont.begin(), cont.end(), value_) != cont.end());
    }

};

struct general {
    template<class T>
    friend specified<T> operator *(T const& rhs, general const&) {
        return specified<T>(rhs);
    }
};

#define in * general() *

int main() {
    std::vector<int> vec{1,2,3};
    std::cout << 1 in vec << std::endl;
    std::cout << 4 in vec << std::endl;
}
#包括

我的问题是,它有什么陷阱吗?安全吗

编辑:


它有一个小的字符串解决方法

无法按预期使用字符串文字

std::vector<string> vec{"1","2","3"};
std::cout << "1" in vec << std::endl;
std::cout << "4" in vec << std::endl;
C++将字符串文本作为
char[]
而不是
string
。所以我们需要明确地提到它

std::cout << string("1") in vec << std::endl;

std::cout不,这不安全,因为您正在使用
\define
。添加一条看起来完全无害的线条

void foo(int in) { }
就在你的主要。在本例中,错误消息非常清楚,但通常不是这样

我知道引入新的语法和很酷的东西很有诱惑力,但是使用宏不是一条好路。无论如何,老实说,如果我必须使用你的代码,我更愿意看到

 std::find(cont.begin(), cont.end(), value_) != cont.end()
我只看那条线而不是一个

value_ in cont

为此,我必须研究一些代码才能真正理解它的含义。

它使用
#define
,不建议用于条件编译以外的任何其他用途。我看到的问题是,要理解vec中
1的含义,我首先必须阅读并理解您的代码。另一方面,
std::find(cont.begin(),cont.end(),value_417;=cont.end()
对任何了解std的人都是清楚的algorithms@tobi303是的,我一直在使用硬编码的
std::find
。这正是我试图创建“in”语法的原因。一直在写
std::find(cont.begin(),cont.end(),value)=cont.end()
就像是每次必须检查容器中是否存在某些东西时,都要一次又一次地重新发明轮子。即使是(V const&V,C const&C){…}
中的
template bool这样的自定义函数也会更好(但从您的角度来看,您仍然需要理解这个函数),但我想进一步说:)一个想法:您可以去掉宏并使用,尽管在这种情况下,如果x vec
,您的代码看起来像是带有附加比较符号的东西。我还认为回购协议中的例子正好涵盖了您的情况,请参见@vsoftco Wow的底部。这是运算符重载的好用法:)我真的认为我可以在竞争性编码中使用它(@shryashssarnayak?你是什么意思?竞争性编码是一个完全不同的故事。在编码竞争中,你经常被迫使用你永远不会在真实代码中使用的脏东西。我知道这是不同的领域。但在cont
中键入
1比
std::find(cont.begin(),cont.end(),1)!=cont.end()更快
。大多数IDE都有可以使用的代码模板,尽管我没有什么经验,因为我不介意再键入一点好的观点。我编辑了这个问题以添加对字符串文本的支持,但您的答案非常有效。
value_ in cont