如何编写 std::chrono::high_resolution clock class 模板专业化只有当它不是别名时

How to write std::chrono::high_resolution clock class template specialization only if it is not alias

我想为 std::chrono::system_clock、std::chrono::steady_clock 和 std::chrono::high_resolution_clock 编写 class 模板专业化。

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

#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 的别名,那么我得到了相同 class 模板特化的错误重新定义。

我正在寻找一种方法来启用 std::chrono::high_resolution_clock class 模板专业化,前提是它不是别名。 我在演示我想做什么的代码中写了注释(伪代码)。

有什么好的方法吗?

您可以根据要检查的条件提供额外的模板参数。主要模板是:

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