https://zh.cppreference.com/w/cpp/language/sfinae
#include <iostream> // 此重载始终在重载集中 // 省略号形参对于重载决议具有最低等级 void test(...) { std::cout << "Catch-all overload called\n"; } // 若 C 是类的引用类型且 F 是指向 C 的成员函数的指针 // 则这个重载被添加到重载集, template <class C, class F> auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { std::cout << "Reference overload called\n"; } // 若 C 是类的指针类型且 F 是指向 C 的成员函数的指针 // 则这个重载被添加到重载集, template <class C, class F> auto test(C c, F f) -> decltype((void)((c->*f)()), void()) { std::cout << "Pointer overload called\n"; } struct X { void f() {} }; int main(){ X x; test( x, &X::f); test(&x, &X::f); test(42, 1337); }
原文:https://www.cnblogs.com/cx2016/p/13447745.html