我该如何重载''运算符?
Posted
技术标签:
【中文标题】我该如何重载\'\'运算符?【英文标题】:How exactly can I overload the '' operator?我该如何重载''运算符? 【发布时间】:2020-03-31 11:49:56 【问题描述】:要初始化一个std::vector,我可以直接使用initializer_list,像这样:
std::vector<int> myVec = 1, 2, 3, 4;
如果我创建一个自定义列表类(它将包含许多项目),例如class customVector
(为了简单起见,仅使用整数,我想我可以自己弄清楚如何使用模板来完成它,如果需要的话),我可以重载运算符'',以使customVector
的实例可以在同一问题中初始化吗?这样我就可以写了
customVector myCustomVec = 1, 2, 3, 4
【问题讨论】:
不是运算符,因此不能重载。运营商是en.cppreference.com/w/cpp/language/expressions#Operators
您可以做vector
所做的事情,并添加一个带有initializer_list
参数的构造函数。
嗯,不,你不能重载
运算符,因为
不是运算符。为您的类提供一个接受 std::initializer_list<something>
参数的构造函数,其中 something
是对该类有意义的类型。
在旁注中,阅读XY problem。 (你的问题是一个。)
另见en.cppreference.com/w/cpp/utility/initializer_list,尤其是示例的S
。
【参考方案1】:
您可以完成您最终想要的事情,但不能通过重载任何运算符 - 不是运算符。
vector
通过使用带有 initializer_list
参数的构造函数来实现这一点,您可以对您的类执行相同的操作。
学习如何做并实施它作为练习。
【讨论】:
【参考方案2】:你不能,因为 不是操作员。在
C++20
之前,以下运算符是可覆盖的:
+ - * / % ^ & | ~ ! =
< > += -= *= /= %= ^= &= |= <<
>> >>= <<= == != <= >= && || ++ --
, ->* -> () []
C++20
添加了宇宙飞船操作员<=>
但我相信就是这样。
【讨论】:
【参考方案3】:正如其他人所指出的, 不是运算符。但是,您仍然可以随意使用initializer list。它是标准库的一部分。
#include <iostream>
#include <initializer_list>
using namespace std;
template <typename T>
struct customVector
customVector(std::initializer_list<T> list) : size(list.size())
arr = new T[size];
int count = 0;
for(auto val: list) arr[count++] = val;
T* arr;
std::size_t size;
~customVector()
for(int i = 0; i < size; i++)
std::cout << arr[i] << std::endl;
delete [] arr;
;
int main()
customVector<int> myCustomVec = 1, 2, 3, 4;
【讨论】:
以上是关于我该如何重载''运算符?的主要内容,如果未能解决你的问题,请参考以下文章