std::initializer_list 作为重载运算符的右手参数?

阿明·蒙蒂尼

我想使用其他编程语言中可用的“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
}

但这不能编译。大概是因为初始化器列表没有表达式。虽然也有例外。Astd::initializer_list可能是一个函数参数,尽管这里也需要表达式。

由于任何运算符基本上也是一个函数,我的希望是,我也可以将其std::initalizer_list用作参数。

但是我不能。

我尝试了相同的方法,operator通过滥用 2 个运算符的重载来定义自己的名称。见下文:

#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';
}

同样的原理,同样的问题。. .

有什么办法可以做到这一点吗?

泰德·林格莫

你需要initializer_list通过const&

bool operator==(const int lhs, const std::initializer_list<int>& il)
std::cout << (3 == std::initializer_list{1,2,3,4,5}) << '\n';

对于is_in测试,您可以重载逗号运算符并执行以下操作:

template<class T>
struct is_in {
    is_in(const std::initializer_list<T>& il) : ref(il) {}
    const std::initializer_list<T>& ref;
};

template<class T>
bool operator,(const T& lhs, const is_in<T>& rhs) {
    return std::find(rhs.ref.begin(), rhs.ref.end(), lhs) != rhs.ref.end();
}

int main() {
    bool b = (5, is_in{ 1, 2, 3, 4, 5 });

    std::cout << b << '\n';
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

数组vs std :: initializer_list作为函数参数

使用std :: initializer_list作为成员变量

作为std :: initializer_list对象的抽象类

如何检测模板参数是否为 std::initializer_list

运算符'='(std :: array <T,3>和std :: initializer_list <T>)不匹配

std :: vector和std :: list的重载运算符

std :: initializer_list的实现

std :: initializer_list的实现

为什么C ++ 11中的std :: initializer_list重载了std :: begin()和std :: end()?

C ++-std :: initializer_list与std :: span

std :: initializer_list作为模板类中的构造函数参数

使用std :: initializer_list []作为长度可变的列表的const列表

std :: make_unique(以及emplace,emplace_back的)对initializer_list参数的尴尬推论

当std :: initializer_list用作赋值参数时,为什么它不是引用类型?

在std :: initializer_list的构造函数的参数列表中的折叠与“正常”折叠

std :: initializer_list可以专用吗?

C ++ std :: initializer_list用法

std :: initializer_list和引用类型

std :: initializer_list构造函数

在clang中返回std :: initializer_list

使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

二进制'[':'std :: initializer_list <const char *>'未定义此运算符或未转换为预定义运算符可接受的类型

无法从std :: initializer_list <int>构造std :: initializer_list <int const>

具有std :: function参数的重载运算符

std :: strings的std :: initializer_list的奇怪行为

带有 std::thread 的 std::initializer_list

有没有一种方法可以在编译时检查std :: initializer_list参数的数量?

std :: list的重载括号运算符

initializer_list和参数相关的查找