我设法弄清楚了如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;
}
我的问题是,它有任何陷阱吗?这样安全吗?
编辑:
答案 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
我必须学习一些代码才能真正理解它的含义。