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,为啥不继续匹配到普通函数版本呢?