使用可变参数模板的成员函数指针包装器

时间:2014-06-18 10:21:10

标签: c++ templates c++11 variadic-templates member-function-pointers

我目前正在尝试使用Visual C ++ 2013编译我的代码,并希望利用可变参数模板。我有几个包装函数指针的类 - 不同数量的参数的几个版本。

具有一个参数的成员函数的包装器如下:

template <typename T, T> struct proxy;

template <typename T, typename R, typename Arg0, R(T::*mf)(Arg0)>
struct proxy<R(T::*)(Arg0), mf>
{
    proxy(T& host) : m_Host(host) {}

    template <typename Arg0>
    R call(Arg0&& arg0)
    {
        return (m_Host.*mf)(std::forward<Arg0>(arg0));
    }

private:
    proxy& operator=(const proxy&);
    T& m_Host;
};

我们有一些测试类:

class SomeHost
{
public:
    int SomeGetter() { return 42; }
    void SomeSetter(int var) { m_Var = var;}
private:
    int m_Var;
};

和测试用例:

void test()
{
    SomeHost obj;
    proxy<void(SomeHost::*)(int), &SomeHost::SomeSetter> g(obj);
    g.call(5);
}

到目前为止一切正常。我使用variadic模板重写了代理类:

template <typename T, typename R, typename... Args, R(T::*mf)(Args...)>
struct proxy<R(T::*)(Args...), mf>
{
    proxy(T& host) : m_Host(host) {}

    template <typename... Args>
    R call(Args&&... args)
    {
        return (m_Host.*mf)(std::forward<Args>(args)...);
    }

private:
    proxy& operator=(const proxy&);
    T& m_Host;
};

使用可变参数模板,Visual C ++ 2013向我展示了来自测试函数的几个编译器错误:

file.cpp(79): error C2440: 'specialization' : cannot convert from 'overloaded-function' to 'void (__thiscall SomeHost::* )(void)'
1> None of the functions with this name in scope match the target type: see reference to class template instantiation 'proxy<void (__thiscall SomeHost::* )(int),SomeHost::SomeSetter>' being compiled
1>file.cpp(79): error C2973: 'proxy<R(__thiscall T::* )(Args...),mf>' : invalid template argument 'overloaded-function'
1>file.cpp(40) : see declaration of 'proxy<R(__thiscall T::* )(Args...),mf>'

我还使用SomeHost :: SomeGetter()测试了模板,它没有任何问题。

非常感谢任何帮助。

非常感谢...

0 个答案:

没有答案