C++;创建新运算符并重载当前运算符 我正在编写一个代码,把一个矩阵转换成C++学习的一部分。我正在做的是运算符重载。但是,通常转置矩阵的符号是“

C++;创建新运算符并重载当前运算符 我正在编写一个代码,把一个矩阵转换成C++学习的一部分。我正在做的是运算符重载。但是,通常转置矩阵的符号是“,c++,operator-overloading,C++,Operator Overloading,“甚至是操作员吗?我知道如果在'之间,您用符号表示一个字符,如果使用'您用符号表示一个字符串。但这些运营商是不是?我可以将它们作为单个字符或甚至整个字符重载吗 我能不能让C++中的新操作符只对特定类的对象工作?我使用的技巧是重载已知的操作符,如+,-,^。。。然后用定义< >我更改预处理器如何处理文本,但最终我仍然重写现有的操作符,并且不能使用任何特殊符号,而是字母。 P>运算符重载仅限于现有的C++操作符集。这是运算符重载,而不是创建。您不能创建像@这样的新运算符,也不能将像'这样的非运算符

甚至是操作员吗?我知道如果在
'
之间,您用符号表示一个字符,如果使用
'
您用符号表示一个字符串。但这些运营商是不是?我可以将它们作为单个字符或甚至整个字符重载吗


我能不能让C++中的新操作符只对特定类的对象工作?我使用的技巧是重载已知的操作符,如

+
-
^
。。。然后用<代码>定义< <代码> >我更改预处理器如何处理文本,但最终我仍然重写现有的操作符,并且不能使用任何特殊符号,而是字母。<> P>运算符重载仅限于现有的C++操作符集。这是运算符重载,而不是创建。您不能创建像
@
这样的新运算符,也不能将像
'
这样的非运算符字符转换为运算符

我能不能让C++中的新操作符只对特定类的对象工作?< /P> 你不能做新的操作员。您只能重新调整现有设备的用途

…然后使用
#define
更改预处理器处理文本的方式


你可能不该这么做。远离预处理器。它是最后的工具。< /P> < P>不能创建不存在的C++标准的运算符。它们不会成为语法的一部分,并且会导致语法错误

因此,运算符可能性与语言语法和语法授权有关(请参阅@afenster answer以获取列表链接)


另一方面,这个操作符问题在Python等其他语言中也是如此,委员会需要决定添加一个新操作符(如矩阵乘法的
@
)对该语言是否有意义。许多运算符都是从数学表达式派生出来的,因此添加没有这种数学背景的新运算符是没有意义的(例如,
*
()

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

只能重载现有运算符

你可以假装一下

namespace my_operator {
  struct transpose_t {};
  constexpr tranpose_t transpose{};

  template<class Matrix>
  Matrix operator^( Matrix lhs, tranpose_t ) {
    lhs.Transpose();
    return lhs;
  }
}

tm
将是
m

的转置。另外,请注意,重载运算符时,可以创建以非预期方式使用类型的可能性。不要太喜欢操作重载,除非它真的提高了代码的清晰度。有关运算符重载的详细信息,请参阅。我所说的只在特定类的对象上工作的新运算符,就像您提到的@和类似。这是不可能的,因为编译器可能不知道这意味着什么,我想?因为它们不是语言语法的一部分,所以编译器将无法解析这些新操作。
using my_operator::transpose;

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