作为编写C ++的一部分,我正在编写用于转置矩阵的代码。我正在做的是运算符重载。但是,通常转置矩阵的符号是'
。
'
甚至是运算符吗?我知道它是在' '
之间表示一个字符,而如果使用" "
则表示一个字符串。但是这些操作员不是吗?我可以将它们重载为单个字符还是整个字符?
我可以在C ++中创建仅对特定类的对象起作用的新运算符吗?我使用的技巧是重载+
,-
,^
等已知的运算符,然后使用#define
更改预处理器处理文本的方式,但是最后,我仍然会覆盖现有的运算符,并且不能使用任何特殊符号,而不能使用字母。
答案 0 :(得分:4)
运算符重载仅限于现有的C ++运算符集。是运算符超载,而不是创建。您不能创建诸如@
之类的新运算符,也不能将诸如'
之类的非运算符转化为运算符。
我可以在C ++中创建仅对特定类的对象起作用的新运算符吗?
您不能使用 new 运算符。您只能重新利用现有的。
...然后用
#define
更改预处理器处理文本的方式...
您可能不应该这样做。远离预处理器。这是不得已的工具。
答案 1 :(得分:3)
您不能创建C ++标准中不存在的运算符。它们不会成为语法的一部分,并且会导致语法错误。
因此,运算符的可能性与语言语法和语法授权的内容相关(请参阅@afenster答案以获取指向列表的链接)。
顺便说一句,此运算符问题在其他语言(例如Python)中也适用,委员会需要确定添加新的运算符(例如用于矩阵乘法的@
)是否适合该语言。许多运算符是从数学表达式派生的,因此添加没有此数学背景的新运算符是没有意义的(例如,*
,()
除外)
答案 2 :(得分:3)
您可以重载的运算符列表为here。不幸的是(或幸运的是)您不能将任何其他字符用作运算符。这样做的最基本原因是,运算符重载不会并且一定不能更改代码语法解析的逻辑(例如什么是运算符,什么不是运算符,什么是运算符优先级等)。
答案 3 :(得分:0)
您只能重载现有的运算符。
您可以伪造一点。
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
的转置。