c++ - 仅当它不是别名时,如何编写 std::chrono::high_resolution 时钟类模板特化

标签 c++ templates c++-chrono specialization high-resolution-clock

我想为 std::chrono::system_clock、std::chrono::steady_clock 和 std::chrono::high_resolution_clock 编写类模板特化。

我写了一个简单的代码如下:

#include <chrono>

template <typename T>
struct foo;

template <>
struct foo<std::chrono::system_clock> 
{};

template <>
struct foo<std::chrono::steady_clock> 
{};

// pseudo code    
//
// if constexpr (
//     !std::is_same_v(std::chrono::high_resolution_clock, std::chrono::system_clock> &&
//     !std::is_same_v(std::chrono::high_resolution_clock, std::chrono::steady_clock>
// ) {
// 

template <>
struct foo<std::chrono::high_resolution_clock> 
{};

// }

int main() {
}

编译结果:https://wandbox.org/permlink/8SqPZsMYdT8WKai3

如果 std::chrono::high_resolution_clock 是 std::chrono::system_clock 或 std::chrono::steady_clock 的别名,那么我会收到相同类模板特化的错误重新定义。

我正在寻找一种方法,仅当 std::chrono::high_resolution_clock 类模板不是别名时才启用它。 我在代码中写了注释(伪代码)来演示我想要做什么。

有什么好的办法吗?

最佳答案

您可以提供一个额外的模板参数,该参数取决于您要检查的条件。主要模板是:

template <typename T, bool = true>
struct foo;

那么特化将是:

template <>
struct foo<std::chrono::high_resolution_clock,
           !std::is_same_v<std::chrono::high_resolution_clock, 
                           std::chrono::system_clock>
           &&
           !std::is_same_v<std::chrono::high_resolution_clock, 
                           std::chrono::steady_clock>
          >
{};

这是一个demo .

关于c++ - 仅当它不是别名时,如何编写 std::chrono::high_resolution 时钟类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62344047/

相关文章:

c++ - 如何部分重载 C++ 模板子类中的虚函数?

c++ - Boost_chrono lib 未安装

c++ - 使用 chrono 的精确时间 sleep

c++ - 为 void 类型部分特化参数包参数的语法是什么?

javascript - Knockout.js动态选择模板错误: "Cannot find template with ID' '"

c++ - Eclipse (Nvidia NSight 7.0) C++ 计时自动完成

c++ - 位掩码动态编程-形成对

c++ - 如何在 C/C++ 中临时禁用宏扩展?

C++如何反转 vector 中元素的顺序?

c++ - 如何将参数传递给构造函数?