行业知识
C++:SFINAE(替换失败不是错误)
2026-11-07 01:52:52
来源:互联网转载
“���换失败不是错误” (Substitution Failure Is Not An Error)
()在函数模板的重载决议中会应用此规则:当模板形参在替换成显式指定的类型或推导出的类型失败时,从重载集中丢弃这个特化,而非导致编译失败。
函数模板重载过程
()- 在模板实参推导前,使用显示指定的模板实参对形参进行替换
template void fun(T){}template void fun(T){}fun(5);//进行中显示部分的替换,T换为int,int换为6- 在模板实参推导后,使用推导出的实参和从默认项获得的实参对形参进行替换
template void fun(T){}template void fun(T){}fun(5);//推导T为int,默认值6替换int- 选择合适的版本,没有合适的版本编译失败
template void fun(int) { std::cout std::cout using type = T;};template};template std::cout std::cout std::cout};//判读有无指定类型的成员变量xtemplate};//判读有无指定类型的成员类型xtemplate};struct A { double x; };struct B { using x = int; };int main() {std::cout
- 选择合适的版本,没有合适的版本编译失败
- 在模板实参推导后,使用推导出的实参和从默认项获得的实参对形参进行替换