首页 > 解决方案 > SFINAE 或 enable_if 检查非类型模板参数是偶数还是奇数

问题描述

template <unsigned int n>
class myclass {};

有没有办法(最好使用 SFINAE,即)在奇怪std::enable_if的时候得到编译错误?n我需要它是平的。

标签: c++sfinae

解决方案


如果你想用 SFINAE 来做,使用部分模板特化并且不要定义基类。

例如:

template <unsigned int n, typename _ = void>
class myclass;

template <unsigned int n>
class myclass<n,std::enable_if_t<n%2==0>> {};

那么如果您尝试myclass使用奇数实例化,您将收到编译时错误。
例如神螺栓


另一种方法是只使用 astatic_assert检查数字是否为偶数,这具有额外的好处,您可以指定一条消息而不是得到一个神秘的 SFINAE 错误:

template <unsigned int n>
class myclass {
    static_assert(n%2==0, "n must be even");
};

例如神螺栓


如果您愿意,您还可以结合上面的两个变体,为您提供一个带有很好错误消息的 SFINAE 解决方案:

template <unsigned int n, typename _ = void>
class myclass {
    static_assert(n!=n, "n must be even");
};

template <unsigned int n>
class myclass<n,std::enable_if_t<n%2==0>> {
    /* code */
};

上帝螺栓示例


如果您使用的是 C++14 之前的 c++ 版本,则需要更换

std::enable_if_t<?>

typename std::enable_if<?>::type

在上面的例子中。


推荐阅读