在C++中模拟 python 的"in"

Simulating python's "in" in C++

本文关键字:in python 模拟 C++      更新时间:2023-10-16

我设法找出了像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;

此代码会导致编译时错误。

error: array used as initializer
  specified(T const& value) : value_(value) {}

C++将字符串文字视为char[],而不是将其视为string。所以我们需要明确提到它。

std::cout << string("1") in vec << std::endl;
不,这是

不安全的,因为您正在使用#define.添加一条看起来完全无害的线条

void foo(int in) { }

就在你主的之前,会破坏代码。在这种情况下,错误消息非常清楚,但通常不是。

我知道引入新的语法和很酷的东西非常诱人,但使用宏不是要走的路。无论如何,老实说,如果我必须使用您的代码,我更愿意看到一个

 std::find(cont.begin(), cont.end(), value_) != cont.end()

我只看那条线而不是

value_ in cont

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