2016-06-02 7 views
0

私は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の派生クラスのメソッドが含まれています(パスカルのプロシージャと同様)。

+0

'get_data'が返す実際のタイプは何ですか? 'My_struct'? –

+1

CRTPは 'クラスDerived:public Base 'であり、他の構造体ではありません。次に、関数を 'T *'に戻すことができます。 –

+0

@ MarkRansom、派生クラスの1つにMy_struct *を戻したい – ilya

答えて

1

Bro! C++ 14に切り替えて、ヒントとして次のコードを使用してみてください:

template <typename Derived> 
struct base 
{ 
template <typename T> 
auto f(T x) 
{ 
    return static_cast<Derived&>(*this).f_impl(x); 
} 

auto g() 
{ 
    return static_cast<Derived&>(*this).g_impl(); 
} 
}; 

struct derived : base<derived> 
{ 
bool f_impl(int x) 
{ 
    return true; 
} 

double g_impl() 
{ 
    return 4.2; 
} 
}; 

このフラグメントはhereから取られています。

関連する問題