c++ - 特定类型的 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()
编写此函数的优雅方式是什么?我曾尝试编写完整版本的Accumulator
forstd::chrono::duration<int64_t, std::nano>
类型,但它看起来像是代码重复。制作具体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
}
推荐阅读
- php - 如何通过终端在本地主机上执行 php 文件的 cronjob
- java - 使用 FileInputStream 从相对路径读取文件
- amazon-web-services - 将 ElasticSearch 置于 AWS 上的代理之后?
- java - 如何从 JTextField 获取价值到 JComboBox?
- c - 动态二维数组的 C 结构:对象 0x7ffeee94ab80 的错误:未分配被释放的指针
- excel - 跨列的目标搜索宏扫描
- wordpress - WordPress 主题开发用户定义的图像选择
- java - ArrayList 被覆盖
- c# - 无法理解如何在异步过程中使用 Progress(T) 更新 UI
- azure-ad-b2c - 在 SPA 的 aspnetboilerplate 中使用 Azure AD B2C 进行 WebApi 身份验证