私はC++ 11を使用しています。Base
クラスと、さまざまな構成ファイルを1行ずつ解析するためのいくつかの派生クラスがあります。CRTPとvoidを返すメソッド*
template <class T>
class Base
{
public:
virtual ~Base();
bool load_from_file(const QString& str);
virtual void* get_data(const QString& str) const = 0;
private:
QList<QSharedPointer<T> > items_;
};
各子孫(class Derived: public Base<My_struct>
)はget_data()
実装を提供しなければなりません。
各My_struct
インスタンスには、設定ファイルの特定の行からの情報が含まれています。
たとえば、プロキシのリストを含む典型的なファイルを想像してみてください。
My_struct
インスタンスは、load_from_file()
メソッドのクラスBase
にスマートポインタでラップされ、items_
メンバに追加されます。 load_from_file()
メソッドは、ラップする前にvoid*
〜T*
をキャストします。
void*
(およびboost::any
のようなライブラリを使用しない)を避けるために、これらのクラスを再設計することは可能ですか?
私はCRTPなどを考えています。通常、CRTPの例には、戻り値がvoid
の派生クラスのメソッドが含まれています(パスカルのプロシージャと同様)。
'get_data'が返す実際のタイプは何ですか? 'My_struct'? –
CRTPは 'クラスDerived:public Base'であり、他の構造体ではありません。次に、関数を 'T *'に戻すことができます。 –
@ MarkRansom、派生クラスの1つにMy_struct *を戻したい – ilya