我想为 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/