如何用SFINAE或std::enable_if校验非类型模板参数是否为偶数
结论
可以通过std::enable_if实现该需求,核心利用SFINAE的「替换失败非错误」特性,仅当模板参数n为偶数时允许模板正常实例化,奇数时触发编译报错。
实现方案
首先需要引入标准库头文件<type_traits>,为原模板新增一个默认的匿名模板参数,用std::enable_if_t约束n的奇偶性:
#include <type_traits> template <unsigned int n, typename = std::enable_if_t<n % 2 == 0>> class myclass {};
如果使用C++11标准,将
std::enable_if_t<n % 2 == 0>替换为typename std::enable_if<n % 2 == 0>::type即可兼容。
效果验证
- 偶数参数可以正常实例化:
myclass<4> obj;编译无报错 - 奇数参数实例化失败:
myclass<5> obj;编译阶段会抛出「没有匹配的myclass模板」类错误,满足约束要求。
如果需要更直观的编译错误提示,也可以搭配static_assert使用,但仅用SFINAE实现的话上述写法已经完全符合要求。
内容的提问来源于stack exchange,提问作者user3600124
相关产品推荐
相关产品推荐

