首页 > 解决方案 > 链接具有不同参数类型的重载运算符

问题描述

假设我有一个类“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)   

但它不起作用......

这可能吗?

标签: c++11overloadingoperator-keywordinitializer-listchaining

解决方案


不,这是不可能的(不是这种用法)。

表达式{ .1f, .1f, .1f } + { .1f, .1f, .1f };不是 aVector并且您定义的任何重载Vector都不会影响它。

我最好的建议是添加一个零项,它是一个向量:

Vector zero_vec = { 0, 0, 0 }; a = zero_vec + { .1f, .1f, .1f } + { .1f, .1f, .1f };

operator+它依赖于左关联的事实。


推荐阅读