如何编写 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。
我想为 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。