编写运算符重载时删除样板代码

问题描述 投票:0回答:1

当我制作 vector3 结构时,我注意到运算符功能几乎彼此相同


vector3 vector3::operator+(float scalar) const {
    return vector3(x + scalar, y + scalar, z + scalar);
}

// And…

vector3 vector3::operator*(float scalar) const {
    return vector3(x * scalar, y * scalar, z * scalar);
}

我能够复制上面的代码并将 + 符号替换为 *。

有没有什么方法可以将这两个函数写在一个函数中,这样每个运算符每次都不会重复重载。

类似于使用

template
,我可以定义序列中的每个运算符,并用名称替换前面代码中的 + 或 *。

template <operatorname o>
vector3 vector3::operator o(float scalar) const {
    return vector3(x o scalar, y o scalar, z o scalar);
}
c++ operator-overloading operators
1个回答
0
投票

您可以编写一个函数模板,将操作一一应用于所有元素:

template <typename F>
void apply(vector3& vec, F&& f) {
      F(res.x);
      F(res.y);
      F(res.z);
}

然后你可以将

operator+=
实现为

vector3::operator+=(float scalar) { 
     apply(*this,[](auto& a) { a += scalar; });
}

请注意,我是从复合运算符开始的,因为您可以用它们来实现非复合运算符。

你可以看到,这实际上并不比拼写少。

其实我觉得你想太多了。使用不同参数调用函数并不是我们通常认为需要避免的代码重复。您的实施是尽可能清晰的。要将向量与标量相乘,请将每个分量与标量相乘。您的代码以可读的方式表达了它没有任何可以删除的多余内容。

© www.soinside.com 2019 - 2024. All rights reserved.