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

标签 c++

我正在尝试用一些有用的东西来度过我的空闲时间。 我正在编写一些基于线性代数的代码,定义 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 类型的变量? (当然,您可以使用独特的类型定义类似的 dotelement 来制作 u *cross* v, u *dot * vu *element* v(和 u/element/v)都可以工作并返回不同的类型。

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

关于c++ - 使用/不使用预处理器在 C++ 中创建新的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870004/

相关文章:

c++ - 带有自定义类指针的优先级队列断言错误

c++ - 为什么我的字符串长度打印为零?

c++ - STL 的 allocator_traits 中静态成员函数的用途是什么?

C++ 模板别名(在特定地方使用)

c++ - getppid() 不返回 parent 的 pid

c++ - 霍夫变换中的OpenCV GPU错误(功能未实现)

c++ - 如何避免产生多个操作数的移位/减少冲突

c++ - 如何计算两个short int的汉明距离?

c++ - 如何获取物理存储设备列表?

c++ - 一道C++接口(interface)(纯虚类)/多重继承/虚继承的设计题