gpt4 book ai didi

c++ - 推断 operator+ 和其他运算符的(模板化)返回类型

转载 作者:行者123 更新时间:2023-12-02 10:21:02 24 4
gpt4 key购买 nike

我正在实现一个二维 vector ,它的坐标可以采用任何算术类型。我想实现一个 operator+以与 unsigned x = 2l + 3.1; 相同的方式从上下文推断其返回类型的运算符知道 + 的结果应该是 unsigned因为它被分配给 unsigned .

到目前为止我所拥有的,灵感来自 Templates inferring type T from return type :

#include <array>
#include <type_traits>

template<typename T,
typename = std::enable_if_t<std::is_arithmetic_v<T>, T>>
class Vec2
{
std::array<T, 2> _data;

public:
// Constructors
Vec2(T x, T y): _data{x, y} {}

// Operators
template<typename TB, // second operand's coordinates type
typename TR> // result's coordinates type
Vec2<TR> operator+(const Vec2<TB> v) const
{
return Vec2<TR>(_data[0] + v._data[0],
_data[1] + v._data[1]);
}
};

int main(void)
{
Vec2 vi{0, 2};
Vec2 vf{1.4, 2.2};

Vec2<int> res = vi + vf;
}

我收到一条错误消息,说它无法推断用于返回值的类型:
$ g++ -Wall -Wextra -std=c++17 poc.cc
poc.cc: In function ‘int main()’:
poc.cc:29:24: error: no match for ‘operator+’ (operand types are ‘Vec2<int, int>’ and ‘Vec2<double, double>’)
29 | Vec2<int> res = vi + vf;
| ~~ ^ ~~
| | |
| | Vec2<double,double>
| Vec2<int,int>
poc.cc:17:14: note: candidate: ‘template<class TB, class TR> Vec2<TR> Vec2<T, <template-parameter-1-2> >::operator+(Vec2<TB>) const [with TB = TB; TR = TR; T = int; <template-parameter-1-2> = int]’
17 | Vec2<TR> operator+(const Vec2<TB> v) const
| ^~~~~~~~
poc.cc:17:14: note: template argument deduction/substitution failed:
poc.cc:29:26: note: couldn’t deduce template parameter ‘TR’
29 | Vec2<int> res = vi + vf;
| ^~
poc.cc:29:15: warning: unused variable ‘res’ [-Wunused-variable]
29 | Vec2<int> res = vi + vf;
| ^~~

最佳答案

在 C++ 中,+运算符重载无法确定其结果将分配给什么。 C++ 根本就不能这样工作。

在许多情况下,可以以略有不同的方式设计替代方案。首先拥有 +运算符(operator)弄清楚它的最佳返回类型应该是什么:

template<typename TB> // result's coordinates type
auto operator+(const Vec2<TB> v) const
{
typedef decltype( static_cast<T>(0) + static_cast<TB>(0) ) ret_t;

return Vec2<ret_t>(_data[0] + v._data[0],
_data[1] + v._data[1]);
}

您确保 TTB是算术类型,所以这是通过 decltype 计算出来的最简单方法.

所以,添加一个 Vec2int s 到 Vec2double s 应该产生一个 Vec2<double> .但是如果这被分配给 Vec2<int> 呢? ?好吧,您只需要一个转换运算符...
template<typename TB>
operator Vec2<TB>() const
{
return Vec2<TB>(_data[0], _data[1]);
}

......并希望最好。

关于c++ - 推断 operator+ 和其他运算符的(模板化)返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60137501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com