マップを使用して連続的なインデックスを内部的に抽象化するテンプレート化された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でコンパイルする必要があります。ブーストは政治のために(まだ)選択肢ではありません。
申し訳ありませんが、これは私の心には決して来なかったtypedefの外で定義された関数ポインタを持つのに慣れています。試してみると、有望だと思われます – antipattern