我一直在努力做一个小的委托模板练习1.)更好的自己,2。)更好地理解模板元编程,以及3.)甚至可能使用委托进行一些事件驱动的编程(因为我不可以访问标准库)。根据{{3}}回答,可以为函数实现以下内容:
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
答案 0 :(得分:2)
Delegate d(myobj, &MyObj::func);
基本上这会使Delegate
独立于成员函数及其类的类型。
只有构造函数模板才能知道返回类型和参数类型。班级没有。您将需要类型擦除以使委托的类型独立于内部函数对象的类型 - 基本上您将实现std::function
,其实现被解释here(注意function
是在返回或参数类型方面没有固定。)
如果您想要的只是语法更好,代码冗余更少,请使用工厂模板:
template <typename T, typename R, typename ...Args>
Delegate<T, R, Args...> make_delegate(T& obj, R (T::*mf)(Args...))
{
return {obj, mf};
}
当使用适当的参数调用时,返回一个具有正确初始化的相应类型的Delegate。
auto deleg = make_delegate(myobj, &MyObj::func);