• 3527阅读
  • 2回复

C++11可变参数模板 [复制链接]

上一主题 下一主题
离线kingkong
 

只看楼主 倒序阅读 楼主  发表于: 2015-10-17

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

只看该作者 1楼 发表于: 2015-10-17
这个也不知道。看看不同编译器的行为是否一致?MSVC的和g++的都试试看?
上海Qt开发联盟,热忱地欢迎你的加入!
离线kingkong

只看该作者 2楼 发表于: 2015-10-17
VS2013   GCC4.9.2都试过了  结果都是直接匹配到成员函数版本2   匹配失败  直接报错了
快速回复
限100 字节
 
上一个 下一个