如何在C++模板类中使用std::enable_if_t且无需新增模板参数
复用类模板参数实现条件化resize方法
我有一套可正常运行的Vector包装类代码,针对不同类型的Vector采用不同的resize逻辑。当前定义std::enable_if_t时引入了额外的模板参数C = Vec,想知道能否直接复用类的模板参数Vec来实现resizeListTo()方法,无需引入第二个模板参数。
现有代码:
template <class Vec> class MyVectorWrapeer<Vec> { private: template <typename C = Vec> std::enable_if_t<someCondition<C, typename C::value_type>, void> static inline resizeListTo(C& c, uint32_t size) { /*Some Code*/ } template <typename C = Vec> std::enable_if_t<!someCondition<C, typename C::value_type>, void> static inline resizeListTo(C& c, uint32_t size) { /*Different Code*/ } public: static void deserializeVector(Vec* dst) { ... resizeListTo(*dst, size); ... } };
我原本尝试的写法无法编译:
template <> std::enable_if_t<someCondition<Vec, typename Vec::value_type>, void> static inline resizeListTo(Vec& c, uint32_t size) {
可以直接复用类的模板参数Vec,不需要额外的C参数。核心是利用**SFINAE(替换失败并非错误)**特性,通过模板参数的条件约束实现重载,避免重复定义问题。
正确实现方式
把enable_if_t放到函数的模板参数中,以此区分两个重载版本:
template <class Vec> class MyVectorWrapeer { private: // 满足someCondition的resize逻辑 template <std::enable_if_t<someCondition<Vec, typename Vec::value_type>, int> = 0> static inline void resizeListTo(Vec& c, uint32_t size) { /*Some Code*/ } // 不满足someCondition的resize逻辑 template <std::enable_if_t<!someCondition<Vec, typename Vec::value_type>, int> = 0> static inline void resizeListTo(Vec& c, uint32_t size) { /*Different Code*/ } public: static void deserializeVector(Vec* dst) { uint32_t size = /* 获取目标大小 */; // 调用时无需额外参数,编译器自动匹配对应版本 resizeListTo(*dst, size); } };
为什么原尝试写法失败
你用template <>的写法是显式特化成员函数,但类本身是模板类,这种写法需要在类外单独定义,且只能针对特定的Vec类型做特化,无法实现基于someCondition的条件分支逻辑,因此编译报错。
内容的提问来源于stack exchange,提问作者DanielHsH
相关产品推荐
相关产品推荐

