有条件的专业化

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 而不是显式的特殊化,这样的重复就不是错误。

以上是关于有条件的专业化的主要内容,如果未能解决你的问题,请参考以下文章

PHP WordPress条件为主页SlideDeck主题代码片段

4.3 合并重复的条件执行片段

自动刷新android片段,直到满足条件

有条件地导入 python 类的片段

片段的条件自定义 OnBackPress

兼容ie8,firefox,chrome浏览器的代码片段