提问者:小点点

如何编写std::chrono::high_resolution时钟类模板专门化,仅当它不是别名时


我想为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类模板不是alias时才启用它。 我在演示我想做什么的代码中写了注释(伪代码)。

有什么好办法吗?


共1个答案

匿名用户

您可以根据要检查的条件提供一个附加的模板参数。 主要模板如下:

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>
          >
{};

这是一个演示。