我想为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时才启用它。 我在演示我想做什么的代码中写了注释(伪代码)。
有什么好办法吗?
您可以根据要检查的条件提供一个附加的模板参数。 主要模板如下:
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>
>
{};
这是一个演示。