在這個階段你可以做不同的事情。
舊C風格類型的解決方案:可以傳遞函數指針:
template <typename T>
void MyTree<T>::traverse(void (*function)(MyTreeNode<T>*, int));
這將需要爲自變量的函數指針(自由功能),其採用一個指向MyTreeNode<T>
對象作爲第一個參數和一個整數作爲第二個參數。你可以typedef
功能類型來緩解用法:
template <typename T>
class MyTree {
public:
typedef void func(MyTreenode<T>*, int); // typedef the function type
typedef void (*pfunc)(MyTreenode<T>*, int); // or the function pointer
void traverse(func* function);
void traverse2(pfunc function);
};
你可以使用任何可調用事情作爲參數與模板的幫助:
template <typename T>
class MyTree {
public:
template <typename Functor>
void traverse(Functor f);
};
其中在最簡單的方法是簡單如果您將參數類型自由釋放,但是如果嘗試傳遞一個可調用的實體並接受一組不同的參數,則錯誤消息可能不那麼容易解析。在內部,你可以使用f
就好像它是一個功能,但在外部可以是一個函數或函數對象,包括std::bind
你可以向前走一步,實際上執行的結果(C++ 0x中)或boost::bind
該traverse
功能你會使用std::function
(同樣,C++ 0x中)使用的參數簽名或boost::function
:
template <typename T>
class MyTree {
public:
void traverse(std::function< void (MyTreeNode<T>*, int)> f);
};
這種解決方案的優點是很明顯你將如何使用傳入的參數(如函數指針方法):您將調用f(x, y)
其中x
是MyTreeNode<T>*
和y
是一個整數。同時,您通過std::bind
(C++ 0x)或boost::bind
提供模板化解決方案的通用性,可用於使不同實體適應function<...>
參數,包括自由函數,函數對象,成員函數......
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=141 – DumbCoder 2010-09-17 11:36:02
難道我怎麼申報「F」或我怎麼申報「MyFunction的」? – Chubsdad 2010-09-17 14:23:26
@Chubsdad,我該如何聲明'MyFunction'。 – BeeBand 2010-09-17 15:39:35