c++11 - 链接具有不同参数类型的重载运算符
问题描述
假设我有一个类“Vector”(数学而不是容器),我想重载运算符,这样我就可以链接计算。
这对我来说很好:
friend Vector operator+(const Vector<N, Type>& a, const Vector<N, Type>& b)
friend Vector operator+( Vector<N, Type>& a, const Vector<N, Type>& b)
有了它,我可以做类似的事情
auto a = vec<3>(.0f, .0f, .0f);
auto b = a + a + a;
但是我也实现了一个初始化列表
Vector& operator=(Type const (&arr)[N])
这使我有可能写出这样的东西:
a = { .1f, .1f, .1f };
a += { .1f, .1f, .1f };
但是我不能做的是链接那些初始化列表。
a = { .1f, .1f, .1f } + b;
a = { .1f, .1f, .1f } + { .1f, .1f, .1f };
我已经尝试添加运算符重载,例如
friend Vector operator+(const Vector<N, Type>& a, Type const (&arr)[N])
friend Vector operator+( Vector<N, Type>& a, Type const (&arr)[N])
friend Vector operator+(Type const (&arr)[N], const Vector<N, Type>& a)
friend Vector operator+(Type const (&arr)[N], Vector<N, Type>& a)
但它不起作用......
这可能吗?
解决方案
不,这是不可能的(不是这种用法)。
表达式{ .1f, .1f, .1f } + { .1f, .1f, .1f };
不是 aVector
并且您定义的任何重载Vector
都不会影响它。
我最好的建议是添加一个零项,它是一个向量:
Vector zero_vec = { 0, 0, 0 };
a = zero_vec + { .1f, .1f, .1f } + { .1f, .1f, .1f };
operator+
它依赖于左关联的事实。
推荐阅读
- vue.js - Vue 登录表单 - “login”属性是必需的
- asp.net-core-mvc - 如何在 ASP NET 核心 MVC 视图组件中调用局部视图?
- python - 使用在 32x32 字母图像上训练的模型预测整个文档的 ocr 文本
- linux - 如何杀死在端口上运行的“不可见”进程
- java - 在 Android 中使用 Picasso 时找不到 get() 方法
- python - 如何将缺少的类别从火车添加到测试数据集中?
- javascript - Web3 签名两倍长
- python - 逐行替换值
- list - 包装小部件列表不更新列表 Flutter
- c# - 家庭作业问题 C# 函数返回“System.Linq.Enumerable+WhereSelectListIterator`2[Exercise6.Exercise6+Student,System.String]”