C++11可变参数模板
template<typename Signature>class myfunction //基本类模板{ }; template<typename R, typename... Args>class myfunction<R (Args...)> //普通函数指针特化版本{ typedef R (*Ptr)(Args...); Ptr m_p;public: myfunction(Ptr p) : m_p(p) { } R operator()(Args... args) { return m_p(args...); }}; template<typename R, typename T, typename ... Args>class myfunction<R(T*, Args...)> //成员函数特化版本1{ typedef R (T::* mPtr)(Args...); mPtr m_p; public: myfunction(mPtr p): m_p(p) { } R operator()(T& likeThis, Args...args) { return (likeThis->*m_p)(args...); }}; template<typename R, typename T, typename ... Args>class myfunction<R(T, Args...)> //成员函数特化版本2{ typedef R (T::* mPtr)(Args...); mPtr m_p; public: myfunction(mPtr p): m_p(p) { } R operator()(T likeThis, Args...args) { return (likeThis.*m_p)(args...); }}; template<typename R, typename T, typename ... Args>class myfunction<R(T&, Args...)> //成员函数特化版本3{ typedef R (T::* mPtr)(Args...); mPtr m_p; public: myfunction(mPtr p): m_p(p) { } R operator()(T& likeThis, Args...args) { return (likeThis.*m_p)(args...); }}; int func1(){ cout << "func1"; return 0;} void func2(int x, int y){ cout << "func2"; cout << x + y;} int main(){ myfunction<int()> f1(func1); f1(); myfunction<void(int, int)> f2(func2); f2(1, 2); return 0;} 我这里模仿C++11中标准库的function,自己写一个可以包装普通函数和成员函数的包装类,使用可变参数模板。最后f1 可以成功,但是f2 匹配到成员函数特化版本2 上去,匹配失败,直接报错了。不是还是 SFINAE,为啥不继续匹配到普通函数版本呢?