【发布时间】:2021-09-23 09:58:24
【问题描述】:
我想使用其他编程语言中可用的“in”运算符之类的东西。我已经阅读了很多关于此的帖子。但是,没有什么能满足我的需要。
我想做的有点不同。请看下面的第一个例子:
#include <iostream>
#include <initializer_list>
#include <algorithm>
bool operator ==(const int lhs, std::initializer_list<int>& il) {
return std::find(il.begin(), il.end(), lhs) != il.end();
}
int main() {
std::initializer_list<int> il{1,2,3,4,5};
std::cout << (3 == il) << '\n';
// std::cout << (3 == {1,2,3,4,5}) << '\n'; // Does not compile
}
但这不会编译。大概是因为初始化列表没有表达式。虽然也有例外。 std::initializer_list 可能是函数参数,但这里也需要表达式。
由于任何运算符基本上也是一个函数,我希望我也可以使用std::initalizer_list 作为参数。
但我不能。
我尝试了相同的方法,通过滥用 2 个运算符的重载来定义一个自己的 operator 名称。见下文:
#include <iostream>
#include <vector>
// New operator: is_in
enum { is_in };
int operator < (const int& lhs, decltype(is_in)) { return lhs; }
int operator > (int lhs, std::vector<int>& rhs) { return std::find(rhs.begin(), rhs.end(), lhs) != rhs.end();}
int operator > (int lhs, std::initializer_list<int>& rhs) { return std::find(rhs.begin(), rhs.end(), lhs) != rhs.end(); }
int main() {
std::vector validValues{ 1, 2, 3, 4, 5 };
bool b = (5 <is_in> validValues);
// bool b = (5 <is_in> { 1, 2, 3, 4, 5 }); // Does not compile
std::cout << b << '\n';
}
同样的道理,同样的问题。 . .
有什么办法可以做到吗?
【问题讨论】:
-
@Jarod42:谢谢。读到我对解决方案的希望只有低到 0。 . .
-
别名缩短
std::initializer_list作为解决方法...
标签: c++ operator-overloading initializer-list