C++11可变参数模板

weixin_38081265 2019-09-19 05:46:47
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,为啥不继续匹配到普通函数版本呢?
...全文
15 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复

435

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧