我一直在努力使小代表模板練習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