c++ - SFINAE 或 enable_if 检查非类型模板参数是偶数还是奇数
问题描述
template <unsigned int n>
class myclass {};
有没有办法(最好使用 SFINAE,即)在奇怪std::enable_if
的时候得到编译错误?n
我需要它是平的。
解决方案
如果你想用 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
在上面的例子中。
推荐阅读
- java - int ai = a[i], j; 是什么意思?做?
- functional-programming - 幺半群和函子之间有什么关系?
- regex - XML 模式正则表达式“/”和“|”
- netlogo - 如何选择列表中价值最高的项目
- python-3.x - 检查目标时出错:预期 dense_6 有 2 个维度,但得到了形状为 (60000, 10, 10, 10, 10) 的数组
- c# - Dapper:不允许从数据类型 datetime 到 int 的隐式转换。使用 CONVERT 函数运行此查询
- java - spring - 引导(创建 bean 时出错) - org.springframework.beans.factory.UnsatisfiedDependencyException:使用名称创建 bean 时出错
- java - 如何使用地理位置数据以编程方式生成 .ics 日历邀请
- excel - 无法在excel中保存工作表
- laravel - 通过多个模型获取相关数据