#include <iostream> // enable_if禁用模板 /* enable_if<bool, typename=void>::type 类型萃取:根据第一个模板参数的编译期表达式决定行为 1.如果这个表达式为true,它的type成员会返回一个类型 -- 如果没有第二模板参数,则返回类型为void -- 否则返回类型是第二个模板参数类型 2.如果表达式为false, 则其成员类型是未定义的,根据模板的一个叫做SFINAE(替换失败不是错误)规则 这会导致包含std::enable_if<>表达式的函数模板被忽略掉 */ template<typename T> typename std::enable_if<(sizeof(T)>=4)>::type func(){ } // 和上面效果一样,达到enable_if第一个参数为false时禁用模板效果 // 当为true时展开为template<typename T, typename=void> template<typename T, typename=std::enable_if_t<(sizeof(T)>=4)>> void func1(){ } // 也可以使用别名模板达到约束效果 template<typename T> using EnableIfSizeGreater4=std::enable_if_t<(sizeof(T)>=4)>; template<typename T, typename=EnableIfSizeGreater4<T>> void func2(){ } void Test(){ // func<char>(); // enable_if第一个参数为false, 推断、替换模板参数失败 // func1<char>(); // enable_if第一个参数为false, 推断、替换模板参数失败 func<int>(); // 返回类型为void func1<int>(); func2<int>(); } int main(){ return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47