有条件的专业化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有条件的专业化相关的知识,希望对你有一定的参考价值。
假设我有以下内容。
template<std::size_t> struct s;
template<> struct s<sizeof(int)> { /*...*/ };
template<> struct s<sizeof(long)> { /*...*/ }; // will not compile as it already exists.
我如何实现一个检查来有条件地区分这两个实例?我只想在它们不相等的情况下实现后者。
很显然。sizeof
不是一个可以被预处理器评估的构造。我有什么选择?
答案
你可以让这两个专门化都采取(不受限制的)。std::size_t
,并且只有在以下情况下才会启用专门化 == sizeof(int)
或 == sizeof(long) && sizeof(long) != sizeof(int)
:
#include <type_traits>
#include <cstddef>
template<std::size_t, typename = void> struct s;
template<std::size_t N>
struct s<N, std::enable_if_t<N == sizeof(int)>> { /* ... */ };
template<std::size_t N>
struct s<N, std::enable_if_t<N != sizeof(int) && N == sizeof(long)>> { /* ... */ };
另一答案
如果你能保留一个 "无效 "的值,你可以用它来代替,以避免碰撞。
template<std::size_t> struct s;
template<> struct s<sizeof(int)> { /*...*/ };
template<> struct s<sizeof(long)==sizeof(int) ? -1 : sizeof(long)> { /*...*/ };
有时也可以使用 if constexpr
而不是显式的特殊化,这样的重复就不是错误。
以上是关于有条件的专业化的主要内容,如果未能解决你的问题,请参考以下文章