特殊类型的模板 operator() 专业化?
Template operator() specialization for a special type?
我有一个基于模板的 Vector class。
我有一个基于 Scott Meyers Dimensional Analysis in C++ 的单位转换模板。我不打算列出它,因为它很复杂,除非没有这些细节就无法解决问题。当我需要将数据传递给外部函数时,我正在使用转换运算符。
template<typename T>
struct XYZVector
{
operator Point3D() { return Point3D(x, y, z); }
}
如果我将 T 用作双精度数,则效果很好。但是当我这样做时,我需要专业化。
Point3D vecOut = XYZVector<Unit::usFoot>(x,y,z);
会失败,因为在转换 Unit 对象时需要使用 as() 方法。
operator Point3D() { return Point3D( x.as<T>(), y.as<T>(), z.as<T>() ); }
所以我需要说如果 T 是一个单位使用这一行,否则使用下一行。
template<typename T>
struct XYZVector
{
//if typename T is a Unit type use this
operator Point3D() { return Point3D( x.as<T>(), y.as<T>(), z.as<T>() ) }
//otherwise use this
operator Point3D() { return Point3D(x, y, z); }
}
这可能吗?
if constexpr
救援。
operator Point3D() {
if constexpr (std::is_same_v<std::remove_cvref_t<T>,Unit>){
return Point3D(x.as<T>(),y.as<T>(),z.as<T>());
}else{
return Point3D(x,y,z);
}
}
我会使用重载作为自定义点:
// overload for built-in type (no ADL)
double to_double(double d) { return d;}
template <typename T>
struct XYZVector
{
// ...
operator Point3D() const {
return Point3D(to_double(x),
to_double(y),
to_double(z));
}
};
// The ones which can be found by ADL can be placed after
namespace Unit {
double to_double(usFoot u) { return u.as<double>(); }
}
我有一个基于模板的 Vector class。 我有一个基于 Scott Meyers Dimensional Analysis in C++ 的单位转换模板。我不打算列出它,因为它很复杂,除非没有这些细节就无法解决问题。当我需要将数据传递给外部函数时,我正在使用转换运算符。
template<typename T>
struct XYZVector
{
operator Point3D() { return Point3D(x, y, z); }
}
如果我将 T 用作双精度数,则效果很好。但是当我这样做时,我需要专业化。
Point3D vecOut = XYZVector<Unit::usFoot>(x,y,z);
会失败,因为在转换 Unit 对象时需要使用 as() 方法。
operator Point3D() { return Point3D( x.as<T>(), y.as<T>(), z.as<T>() ); }
所以我需要说如果 T 是一个单位使用这一行,否则使用下一行。
template<typename T>
struct XYZVector
{
//if typename T is a Unit type use this
operator Point3D() { return Point3D( x.as<T>(), y.as<T>(), z.as<T>() ) }
//otherwise use this
operator Point3D() { return Point3D(x, y, z); }
}
这可能吗?
if constexpr
救援。
operator Point3D() {
if constexpr (std::is_same_v<std::remove_cvref_t<T>,Unit>){
return Point3D(x.as<T>(),y.as<T>(),z.as<T>());
}else{
return Point3D(x,y,z);
}
}
我会使用重载作为自定义点:
// overload for built-in type (no ADL)
double to_double(double d) { return d;}
template <typename T>
struct XYZVector
{
// ...
operator Point3D() const {
return Point3D(to_double(x),
to_double(y),
to_double(z));
}
};
// The ones which can be found by ADL can be placed after
namespace Unit {
double to_double(usFoot u) { return u.as<double>(); }
}