首页 > 解决方案 > 特定类型的 C++ 模板

问题描述

所以我有这个小模板类:

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()编写此函数的优雅方式是什么?我曾尝试编写完整版本的Accumulatorforstd::chrono::duration<int64_t, std::nano>类型,但它看起来像是代码重复。制作具体Convert(std::chrono::duration<int64_t, std::nano> value)不适用于不同的版本Convert(T value)

gcc 9.3.0 上的 C++14。

标签: c++templatesc++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
}

推荐阅读