特定类型的 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
}
所以我有了这个小模板 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
}