如何声明不同类型的模板化类之间的转换
How to declare conversions between different types of a templated class
我有一个模板化的几何向量类。这是它的简化版本。
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];
};
相关文章:
- 构造函数和转换运算符之间的重载解析
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何声明不同类型的模板化类之间的转换
- C 和 C++ 中的函数指针转换之间的差异
- 与浮点转换之间的规范化整数
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- Clang和GCC中不明确基类转换之间的行为差异
- 转换之间的双和字节数组,为传输ZigBee API
- 隐式转换和显式转换之间的区别
- interpret_cast和C样式强制转换之间的区别是什么