特殊类型的模板 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>(); } 
}