我寫了一個模板化的Matrix
結構,它通過使用地圖在內部抽象連續索引。如何簡化模板化回調函數的定義?
Matrix<TCell, TKey> m;
有擴大結構的功能,我想給用戶傳遞一個函數指針(initFunc
)填充新創建的細胞的能力。現在
void ExpandMatrix(Matrix<TCell, TKey>* matrix,
std::set<TKey>* keys_c,
std::set<TKey>* keys_r,
??? /*Function pointer to callback function */
)
我的問題是,這個用戶提供的函數需要傳遞一個指針,以及細胞,沒有任何內部計數器我用的鑰匙。這些通過模板定義爲TCell
和TKey
。所以我不能用這個,因爲它還不知道究竟TCell
或TKey
是:
typedef void (*initFunc)(TCell* pCell, TKey key_c, TKey key_r)
至於我的研究去,它是不可能的模板函數指針:
template<typename TCell, typename TKey>
typedef void (*initFunc)(TCell* pCell, TKey key_c, TKey key_r)
什麼我目前的做法是將該功能包裝在用戶認爲可以派生的類中,但這對用戶來說很麻煩。沒有更好的解決方案嗎?
template <typename TCell, typename TKey>
class DefaultCellInitializer
{
public:
virtual void Initialize(TCell* t, TKey key_c, TKey key_r)
{
return;
}
};
template<typename TCell, typename TKey>
void ExpandMatrix( Matrix<TCell, TKey>* matrix,
std::set<TKey>* keys_c,
std::set<TKey>* keys_r,
CellInitializer<TCell, TKey> initializer = DefaultCellInitializer)
注意:我需要允許一個默認值,它無法處理傳統方法的使用。歡迎使用C++ 11,但必須在MSVC 2012上進行編譯。由於政治原因,Boost尚未成爲一種選擇。
好的,我很習慣於用typedef定義外部的函數指針,這是我從未想到的。要嘗試它,看起來很有前景 – antipattern