我知道可以重载 C++ 中已经存在的运算符来定义所需的行为,但是是否可以创建自己的运算符?
举个例子,创建一个返回容器大小的运算符
#
:
template<typename T>
size_t operator#(const T& obj) { return obj.size(); }
vector<int> v(1024);
cout << #v; // prints 1024
不。您需要坚持使用解析器已经知道如何处理的运算符。重载可以扩展表达式的含义,但是语法是固定的。
不,这是不可能的。
无论如何,如果你将容器称为“定义”,会发生什么情况?
您可以创建一个新类型(称之为
Foo
),然后创建一个 Bar::operator Foo()
,将 Bar
转换为 Foo
。
这可能不是您要找的。
您无法创建自己的
#
运算符。作为一个入门者,它在(已经非常臃肿的)C++ 优先级表中应该处于什么位置?它具有从左到右或从右到左的关联性吗?您将如何指定这些内容以及更多内容?
创建一个全新的操作符会带来很多问题,以至于语言根本不允许这样做。
正如已经回答的那样,不!您只能重载所有已知的运算符,顺便说一句,您无法更改预定运算符的行为,那么您就无法更改运算符“+”的行为,例如,对于 int 数据类型。 ;)
愿c++之神原谅我。
是的,不可能在 C++ 中创建自己的运算符。但是您可以创建一个行为类似于运算符的宏。为此,您可以为它们创建具有我们需要的优先级的辅助类型和重载运算符。接下来,您可以使用这个宏模板:
#define [my new operator] \
[overloaded operator] [auxiliary type] [overloaded operator] \
https://godbolt.org/z/zhr1MMc7n
(谦卑地忍受不喜欢的亵渎)))))))))