特定类型的 C++ 模板

C++ template for specific type

所以我有了这个小模板 class:

template <typename T, typename std::enable_if<std::is_arithmetic<T>{} || std::is_same<T, std::chrono::duration<int64_t, std::nano>>{}, int>::type = 0>
class Accumulator
{
  public:
    void Sample(const T value) {
        value_ = Convert(value);
    }
  private:
    float value_;
}

它需要对所有算术类型和std::chrono::duration<int64_t, std::nano>类型起作用。里面有一些数学运算,所以所有传递给 Sample() 方法的值都必须转换为 float.

编写此 Convert() 函数的优雅方式是什么?我已经尝试为 std::chrono::duration<int64_t, std::nano> 类型编写完整版本的 Accumulator,但它看起来像是代码重复。制作特定的 Convert(std::chrono::duration<int64_t, std::nano> value) 不适用于不同的版本 Convert(T value)

gcc 9.3.0 上的 C++14。

template <typename T, typename std::enable_if<std::is_arithmetic<T>{} || std::is_same<T, std::chrono::duration<int64_t, std::nano>>{}, int>::type = 0>
class Accumulator
{
  public:
    void Sample(const T value) {
        value_ = Convert(value);
    }
  private:
    float value_;
};
template <class U>
float Convert(U value) {
   // default overload
}
inline float Convert(std::chrono::duration<int64_t, std::nano> value) {
    // specialization for duration
}