C++中能否不依赖结构体仅通过函数实现模板偏特化?
C++标准仅允许类模板偏特化,不支持函数模板偏特化,因此你尝试的对非类型模板参数n做偏特化的写法不符合语法要求。不需要额外定义结构体的实现方案如下:
方案1:C++17及以上使用if constexpr(最简洁,单函数实现)
直接通过编译期分支判断实现逻辑,无需拆分多份特化代码:
#include <cstddef> #include <type_traits> template <std::size_t n, typename type_t> constexpr type_t cus_pow(type_t b) noexcept { if constexpr (n == 0) { (void)b; // 消除变量未使用警告 return static_cast<type_t>(1); } else { return b * cus_pow<n - 1>(b); } }
加上constexpr修饰后,如果入参b是编译期常量,整个计算过程会在编译阶段完成,运行期直接返回结果。
方案2:C++11/14使用SFINAE重载实现
如果需要兼容旧标准,可以通过std::enable_if对模板参数的取值做限制,实现两个同名函数重载,无需额外定义结构体:
#include <cstddef> #include <type_traits> template <std::size_t n, typename type_t> typename std::enable_if<n == 0, type_t>::type cus_pow(type_t b) { (void)b; return static_cast<type_t>(1); } template <std::size_t n, typename type_t> typename std::enable_if<n != 0, type_t>::type cus_pow(type_t b) { return b * cus_pow<n - 1>(b); }
方案3:C++20使用约束(Concepts)简化写法
C++20引入的约束语法可以进一步简化SFINAE的写法,可读性更高:
#include <cstddef> template <std::size_t n, typename type_t> type_t cus_pow(type_t b) requires (n == 0) { (void)b; return static_cast<type_t>(1); } template <std::size_t n, typename type_t> type_t cus_pow(type_t b) requires (n != 0) { return b * cus_pow<n - 1>(b); }
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

