我目前正在尝试使用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()测试了模板,它没有任何问题。
非常感谢任何帮助。
非常感谢...