匹配失败非错误原则SFINAE
“匹配失败非错误原则”(Principle of non-error on match failure)是C++模板元编程中的一个重要原则。这个原则的含义是,如果一个模板实例化失败,那么这不是一个错误,编译器应该继续尝试其他的模板。
这个原则在C++的模板特化和函数模板重载中尤其重要。编译器会尝试所有可能的模板,如果某个模板无法实例化(例如,因为某个类型没有提供必要的成员函数),那么编译器会忽略这个模板,继续尝试其他的模板。只有当编译器找不到任何可以实例化的模板时,才会产生错误。
这个原则使得C++的模板系统具有很大的灵活性。你可以为不同的类型提供不同的模板特化,编译器会自动选择最合适的模板。同时,你也可以为不同的函数参数类型提供不同的函数模板,编译器会根据函数调用的实际参数类型选择最合适的函数模板。
代码例子(线程池构建):
template <typename Func, typename T, typename... Args>
auto _call_func(Func func, T* instance, Args&&... args)
->