C++创建新的运算符并使当前运算符重载

C++ creating new operators and overloading the current ones

本文关键字:运算符 重载 C++ 创建      更新时间:2023-10-16

我正在编写用于转置矩阵的代码,作为学习C++的一部分。我正在做的是运算符重载。但是,通常转置矩阵的表示法是 ' .

'甚至是操作员吗?我了解它是否介于您注释字符' '之间,如果您使用" "则表示字符串。但是这些运营商是否?我可以将它们作为单个字符甚至整个字符超载吗?

我可以在C++中创建新运算符,这些运算符仅适用于特定类的对象吗?我使用的技巧是重载已知的运算符,如+-^、...然后#define我更改了预处理器处理文本的方式,但最终我仍然会覆盖现有的运算符,并且我不能使用任何特殊符号,而是使用字母。

运算符

重载仅限于现有的C++运算符集。这是运算符重载,而不是创建。您不能像@那样创建新的运算符,也不能将像'这样的非运算符字符转换为运算符。

我可以在C++中创建新运算符,这些运算符仅适用于特定类的对象吗?

不能创建新的运算符。您只能重新利用现有的。

。然后#define我更改预处理器处理文本的方式......

你可能不应该这样做。远离预处理器。这是最后的手段。

不能创建不作为C++标准的一部分存在的运算符。它们不会成为语法的一部分,并会导致语法错误。

因此,运算符的可能性与语言语法和语法授权的内容相关联(有关列表的链接,请参阅@afenster答案(。

附带说明一下,这个运算符问题在其他语言(如 Python(中也是如此,委员会需要决定添加新运算符(如矩阵乘法的 @(是否对该语言有意义。 许多运算符都派生自数学表达式,因此添加没有这种数学背景的新运算符是没有意义的(例外情况*, 例如()(

您可以重载的运算符列表在这里。不幸的是(或幸运的是(,您不能使用任何其他字符作为运算符。最基本的原因是运算符重载不会也不得更改代码语法解析的逻辑(例如什么是运算符,什么不是运算符,运算符优先级是什么等(。

您只能重载现有运算符。

你可以假装一下。

namespace my_operator {
  struct transpose_t {};
  constexpr tranpose_t transpose{};
  template<class Matrix>
  Matrix operator^( Matrix lhs, tranpose_t ) {
    lhs.Transpose();
    return lhs;
  }
}

鉴于此,以及具有自转置.Transpose()方法的矩阵类型,我们得到:

using my_operator::transpose;
MATRIX m = {/* whatever */};
MATRIX tm = m^transpose;

tm将是m的转置.