我正在尝试用一些有用的东西来度过我的空闲时间。 我正在编写一些基于线性代数的代码,定义 Rn vector 、矩阵和操作。
当我编写用于计算两个 R3 vector 之间的叉积的代码时,我面临着创建一个名为 x
的新运算符的可能性,然后我可以使用 u x v
u.vectorial(v);
的。
我告诉你这些是因为我读了一些东西,发现使用预处理器我可以做我想做的事情。那么,有什么办法可以做到这一点吗?
最佳答案
这不会有好结果。 C++ 本身不支持创建新运算符,只为现有运算符提供自定义的每种类型的行为。并且预处理器不按类型执行任何操作,也不支持中缀表示法。
我肯定不会尝试使用单字母运算符,因为它们会在您的程序中被替换任何地方。
要让像u cross v
这样的东西工作,你可以
#define cross * cross_product_helper() *
然后使用表达式树中的一些技术——operator*(vec, cross_product_helper)
返回一个包含 vector 并知道它想要进行叉积的辅助类型,第二次使用 *
实际上做乘法。
另一方面,将代码写成这样会不会很糟糕:
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^
,因为它具有与产品相关的优先级和其他语法属性。
关于c++ - 使用/不使用预处理器在 C++ 中创建新的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870004/