使用/不使用预处理器在c ++中创建新运算符

时间:2014-04-04 18:06:13

标签: c++

我正在尝试将我的空闲时间花在有用的东西上。 我正在编写一些基于线性代数的代码,定义Rn向量,矩阵和运算。

当我编写用于计算两个R3向量之间的交叉乘积的代码时,我遇到了创建一个名为x的新运算符的可能性,然后我可以使用u x v代替u.vectorial(v);

我告诉你这是因为我读了一些事情并且看到了预处理器,我可以做我喜欢的事情。那么,有没有办法可以做到这一点?

2 个答案:

答案 0 :(得分:7)

这不会结束。 C ++本身不支持创建新的运算符,只为现有运算符提供自定义的每类型行为。并且预处理器不执行任何类型的操作,也不支持中缀表示法。

我肯定不会尝试使用单字母操作符,因为它们会在您的程序中替换无处不在

要使u cross v之类的工作正常,你可以

#define cross * cross_product_helper() *

然后使用表达式树中的一些技术 - operator*(vec, cross_product_helper)返回一个包含向量的帮助器类型并知道它想要交叉产品,*的第二次使用实际上是乘法。

另一方面,将代码编写为:

会是如此糟糕
u *cross* v

crosscross_product_helper类型的预定义,适当范围的变量? (当然,您可以使用唯一类型定义类似dotelement来制作u *cross* vu *dot* vu *element* v(以及u /element/ v )所有的工作和返回不同的类型。

请注意,我选择了operator*作为*cross*的基础,而不是+cross+^cross^,因为它具有优先级和其他语法属性与产品相关。

答案 1 :(得分:0)

不要使用预处理器。他们很坏。最好避免。您应该研究重载运算符。 http://www.functionx.com/cpp/Lesson25.htm