如何声明不同类型的模板化类之间的转换

How to declare conversions between different types of a templated class

本文关键字:转换 之间 同类型 何声明 声明      更新时间:2023-10-16

我有一个模板化的几何向量类。这是它的简化版本。

template<class T>
class Vec3 {
public:
Vec3(const T& x, const T& y, const T& z) {
m_v[0] = x;
m_v[1] = y;
m_v[2] = z;
}
T m_v[3];
};

我使用此类的双重版本和浮点版本。

using Vec3D = Vec3<double>;
using Vec3F = Vec3<float>;

我想补充的是从浮点版本到双精度版本的隐式转换。最好的方法是什么?

您可以添加模板构造函数(可能使用 SFINAE(:

template<class T>
class Vec3 {
public:
Vec3(const T& x, const T& y, const T& z) {
m_v[0] = x;
m_v[1] = y;
m_v[2] = z;
}
// It is not a copy constructor.
template <typename U>
Vec3(const Vec3<U>& rhs) {
m_v[0] = rhs.m_m_v[0];
m_v[1] = rhs.m_m_v[1];
m_v[2] = rhs.m_m_v[2];
}
T m_v[3];
};

如果你只想处理浮点数到双倍,在 C++20 中,你可以使用requires"丢弃"方法:

template<class T>
class Vec3 {
public:
Vec3(const T& x, const T& y, const T& z) {
m_v[0] = x;
m_v[1] = y;
m_v[2] = z;
}
Vec3(const Vec3<float>& rhs) requires (std::is_same_v<double, T>) {
m_v[0] = rhs.m_m_v[0];
m_v[1] = rhs.m_m_v[1];
m_v[2] = rhs.m_m_v[2];
}
T m_v[3];
};