これは、継承、テンプレート クラス、および関数ポインタに関する問題です。私はモジュラーツールを開発しています。これは最小限の描写です。
私は可能な限り一般的である必要があるジェネリック基本クラスを持っています (理由はここでは指定されていません):
// base class
class Base {
public:
virtual void assess( ) = 0;
};
次に、テンプレートとして定義する、より特化した派生クラスがあります。
// derived template class
template <typename T>
class Derived : public Base
{
protected:
T mValue;
public:
void assess( );
T value( ) { return mValue; }
};
// function specialization here
template<>
inline void Derived<int>::assess( )
{
mValue = 3;
}
assess()
上記のように、関数のように一部の部分は特殊化されています。
次に、継承の追加レイヤーがあります。主なアイデアは、引数としてオブジェクトをassess()
持つ関数ポインターを含む一般的な関数を持つことです。Base
// class specialization for special evaluation through function pointers
template <typename T>
class DerivedFuncPtr : public Derived<T> {
protected:
T (*mFuncPtr)( Base& );
Base *mFuncVar;
public:
DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )
{
mFuncPtr = f;
mFuncVar = variable;
}
void assess( )
{
mFuncVar->assess();
this->mValue = (*mFuncPtr)(*mFuncVar);
}
};
さて、問題は使い方です。主なソースは次のようになります。
int squared( Derived<int>& );
int squared( Derived<int>& d )
{
int val = d.value();
return val*val;
}
int main (int argc, const char * argv[])
{
Derived<int> object;
object.assess();
cout << object.value() << "\n" ;
DerivedFuncPtr<int> objectFP( squared, object ); // (*)
return 0;
}
オンラインでのコンパイルでエラーが発生する(*)
Candidate constructor not viable: no known conversion from 'int (Derived<int> &)' to 'int (*)(Base &)' for 1st argument
関数ポインターをテンプレート化されたクラスにカプセル化するU (*)(Base&)
必要がありますか、それともここで明らかな何かが欠けていますか?
美学のために、そして私は最近の C++ の進化に慣れていないので、boost
ライブラリや C++11 を使用したくないのですが、やむを得ない場合は... ありがとうございます。