我正在尝试将我的空闲时间花在有用的东西上。 我正在编写一些基于线性代数的代码,定义Rn向量,矩阵和运算。
当我编写用于计算两个R3向量之间的交叉乘积的代码时,我遇到了创建一个名为x
的新运算符的可能性,然后我可以使用u x v
代替u.vectorial(v);
我告诉你这是因为我读了一些事情并且看到了预处理器,我可以做我喜欢的事情。那么,有没有办法可以做到这一点?
答案 0 :(得分:7)
这不会结束。 C ++本身不支持创建新的运算符,只为现有运算符提供自定义的每类型行为。并且预处理器不执行任何类型的操作,也不支持中缀表示法。
我肯定不会尝试使用单字母操作符,因为它们会在您的程序中替换无处不在。
要使u cross v
之类的工作正常,你可以
#define cross * cross_product_helper() *
然后使用表达式树中的一些技术 - operator*(vec, cross_product_helper)
返回一个包含向量的帮助器类型并知道它想要交叉产品,*
的第二次使用实际上是乘法。
另一方面,将代码编写为:
会是如此糟糕u *cross* v
cross
是cross_product_helper
类型的预定义,适当范围的变量? (当然,您可以使用唯一类型定义类似dot
和element
来制作u *cross* v
,u *dot* v
和u *element* v
(以及u /element/ v
)所有的工作和返回不同的类型。
请注意,我选择了operator*
作为*cross*
的基础,而不是+cross+
或^cross^
,因为它具有优先级和其他语法属性与产品相关。
答案 1 :(得分:0)
不要使用预处理器。他们很坏。最好避免。您应该研究重载运算符。 http://www.functionx.com/cpp/Lesson25.htm