我一直在努力使小代表模板练习1)更好的自己,2)更好地了解模板元编程,以及3)甚至可能使用委托对一些事件驱动编程(如我无法访问标准库)。据this答案,像下面这样可以为功能实现:C++委托行使
template <typename T, typename R, typename ...Args>
R proxycall(T & obj, R (T::*mf)(Args...), Args &&... args)
{
return (obj.*mf)(args...);
}
proxycall(myobj, &MyObj::func);
看来,如果编译器可以计算出返回类型,类类型和参数类型只是路过myobj
和&MyObj::func
到模板。可以在上面相同的方法被用来创建一个委托类(其存储既一个对象和一个指针到成员函数引用类)?
Delegate d(myobj, &MyObj::func); /* Preferred */
或
Delegate<myobj, &MyObj::func> d; /* Ok */
下面的类是我的Delegate类,它有具有指定ReturnType
的不幸的副作用,并在相应的成员函数的类型Parameters
的。正如我上面看到的那样,编译器可以将这些东西计算出来。那么,我如何让编译器帮助我?
template <class Class, typename ReturnType, typename ... Parameters>
class Delegate {
public:
typedef ReturnType (Class::*Method)(Parameters ... params);
Delegate(Class& ref, Method m) : obj(ref), method(m) {}
ReturnType operator()(Parameters ... params) { return (obj.*method)(params...); }
ReturnType Invoke(Parameters ... params) { return operator()(params...); }
private:
Class& obj;
Method method;
};
/* Usage */
Delegate<MyObj, void> d(myobj, &MyObj::func);
^^^^^^^^^^^
ick
如果我没有记错的话,在'proxycall'你应该有'的std ::向前(参数)...',而不是'ARGS ...'。 –
cdhowie
2014-11-05 18:13:14