2016-06-02 26 views
0

Ich benutze C++ 11. Ich habe eine Base Klasse und mehrere abgeleitete Klassen für die Analyse verschiedener Konfigurationsdateien Zeile für Zeile.CRTP und Methode zurückgeben 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_; 
}; 

Jeder Nachkomme (class Derived: public Base<My_struct>) muss get_data() Umsetzung.
Jede My_struct Instanz enthält Informationen aus einer bestimmten Zeile einer Einstellungsdatei.

Stellen Sie sich beispielsweise eine typische Datei mit einer Liste von Proxies vor.
My_struct Instanzen sind in Smart-Pointer in Base Klasse in der load_from_file() Methode verpackt und an die items_ Mitglied angehängt. load_from_file() Methode wirft void* zu T* vor dem Einwickeln.

Ist es möglich, diese Klassen neu zu gestalten, um die Verwendung von void* (und ohne Bibliotheken wie boost::any) zu vermeiden?
Ich meine CRTP und so weiter. Normalerweise enthalten CRTP-Beispiele Methoden abgeleiteter Klassen mit void Rückgabewerten (wie in Pascal).

+0

Welchen Typ möchten Sie eigentlich 'get_data' zurückgeben? 'My_struct'? –

+1

CRTP ist 'Klasse abgeleitet: öffentliche Basis ', nicht einige andere Struktur. Dann können Sie die Funktion 'T *' zurückgeben lassen. –

+0

@MarkRansom, ich möchte My_struct * in einer der abgeleiteten Klassen zurückgeben – ilya

Antwort

1

Bro! Versuchen Sie, C++ und 14 verwenden, um den folgenden Ausschnitt als Hinweis schalten:

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; 
} 
}; 

Dieses Fragment aus here genommen wurde.