【问题标题】:C++ template for specific type特定类型的 C++ 模板
【发布时间】:2020-09-03 00:48:26
【问题描述】:

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

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&lt;int64_t, std::nano&gt; 类型。里面有一些数学运算要做,所以所有传递给Sample()方法的值都必须转换为float

编写这个Convert() 函数的好方法是什么?我尝试为std::chrono::duration&lt;int64_t, std::nano&gt; 类型编写完整版本的Accumulator,但它看起来像代码重复。制作特定的Convert(std::chrono::duration&lt;int64_t, std::nano&gt; value) 不适用于不同版本的Convert(T value)

gcc 9.3.0 上的 C++14。

【问题讨论】:

  • 我看不出Convert会有什么问题
  • 将非引用参数作为const 有点没有意义。您已经向调用者保证您不会改变他们传入的内容,因为您正在按值获取参数。

标签: c++ templates c++14


【解决方案1】:
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
}

【讨论】:

  • 你甚至不需要特化,你可以用非模板版本重载函数(只要调用者没有明确指定模板参数)。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2017-04-04
  • 1970-01-01
相关资源
最近更新 更多