メンバー関数テンプレート ( などgetData()
) を仮想にすることはできません。ただし、仮想メンバー関数を含むクラス テンプレートを使用できます。
template <class T>
class data_ppp {
public:
virtual boost::shared_ptr<T> getData()
{
return boost::shared_ptr<T>(new T());
}
};
これにより、かなり多くのカスタマイズが可能になります。
1)クラスを定義できますdata_ppp< std::vector<int> >
。そのクラスがジェネリックとして動作する必要があるT
場合は、完了です。
2)特定のデータ用途の動作をオーバーライドしたいが、すべてのタイプの動作をオーバーライドしT
、新しい機能を動的に使用したい場合は、次から派生できます。data_ppp<T>
template <class T>
class data_child: public data_ppp<T> {
public:
virtual boost::shared_ptr<T> getData()
{
// add logging, printing or whatever you want
return boost::shared_ptr<T>(new T());
}
};
3) equal toのみを再定義getData()
したい場合は、特殊化するだけで済みますT
std::vector<int>
data_ppp
template <>
class data_ppp< std::vector<int> > {
typedef std::vector<int> T;
public:
virtual boost::shared_ptr< T > getData()
{
// add logging, printing or whatever you want
return boost::shared_ptr<T>(new T());
}
};