在C ++中模拟python的“in”

时间:2017-03-25 18:26:21

标签: python c++ templates operator-overloading

我设法弄清楚了如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;
}

LIVE on Coliru

我的问题是,它有任何陷阱吗?这样安全吗?

编辑:

Support for string literals

2 个答案:

答案 0 :(得分:2)

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

不能按预期使用字符串文字。

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;

答案 1 :(得分:1)

不,它不安全,因为您正在使用#define。添加完全无害的外观

void foo(int in) { }

就在您的主要will break the code之前。在这种情况下,错误消息非常清楚,但一般情况下它不是。

我知道引入新语法和很酷的东西很诱人,但使用宏不是最佳选择。无论如何,说实话,如果我不得不使用你的代码,我宁愿看到

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

通过仅查看该行而不是

,我知道它意味着什么
value_ in cont

我必须学习一些代码才能真正理解它的含义。