2016-07-20 16 views
3
Situation

Ich versuche, einen Container zu implementieren, der einen bestimmten Datentyp enthält - nennen wir es C. Der Container (nennen wir es B) ist eine innere Klasse von A. Ich versuche, die Vorlage zu deklarieren aber ich stoße auf Compilerprobleme und bin mir nicht sicher, was ich tun soll.Vorlage einer Klasse, die eine Konstante-Typ-Vorlage enthält?

Versuche

template <typename T<C>> 
class A 
{ 
    class B 
    { 
    typedef std::unique_ptr<T> containerPtr; 
    private: 
     containerPtr container; 
    } 
} 

typedef std::shared_ptr<A<std::vector<C>>> somePtr; // Error! 

Der Fehler ist:

struct C

Typname

nicht erlaubt ist

template <typename T,U> 
class A 
{ 
    class B 
    { 
    typedef std::unique_ptr<T<U>> containerPtr; 
    private: 
     containerPtr container; // But does it contain C or some other type now? 
     // We have to do a check - what's the best approach? 
    } 
} 

typedef std::shared_ptr<A<std::vector<C>>> somePtr; 

Was ist der beste Ansatz in dieser Situation?

Antwort

5

Wenn Sie für eine Tatsache wissen, dass T eine Vorlage Container ist eine Art C speichern, dann brauchen Sie nicht C überall zu spezifizieren und kann nur templatize über T:

template <typename T> 
class A { 
    class B { 
     /* Use the type name T however you'd like. */ 
    }; 
}; 

Das funktioniert, weil T hat der Name eines kompletten Typ zu sein, also, wenn Sie so etwas wie

A<std::vector<int>> 

tun dann T ist std::vector<int> und jede t Sie verwenden T es wird speziell ein std::vector von int s und nicht von einem anderen Typ sein.

Auf der anderen Seite, wenn Sie den Client mögen den Namen einer Template-Klasse zur Verfügung zu stellen und dann instanziiert sie gewaltsam mit Ihrer Wahl von C, können Sie Template-Template-Argument wie folgt verwenden:

template <template <typename...> class T> 
class A { 
    class B { 
     typedef std::unique_ptr<T<C>> containerPtr; 
     /* ... use containerPtr ... */ 
    }; 
}; 

Dies fordert den Benutzer auf eine Vorlage Art zu geben, so würden Sie so etwas wie

A<std::vector> myObject; 

und Ihre A Vorlage schreiben, wird danninstanziiertmit dem Typ C.

+0

Wow - Ich wollte deine Antwort akzeptieren, bevor du mir die extra editierte Antwort gegeben hast. Du hast meine Gedanken gelesen, was ich tun wollte. Vielen Dank! (Ich versuchte den zweiten Versuch, entschied aber zögerlich, dass ich mich mit dem ersten zufrieden geben würde) Können Sie erklären, was die '' tut? – OneRaynyDay

+0

@OneRaynyDay Der allgemeine Ansatz hier wird als * Template-Template-Argument * bezeichnet - wir stellen eine Vorlage als Argument für eine Vorlage zur Verfügung. Die Notation 'template Klasse T>' bedeutet "das Argument ist eine Template-Klasse mit dem Namen' T', und es ist uns egal, wie viele Argumente diese Template-Klasse benötigt. " – templatetypedef

+0

Ah, danke! Und danke, dass du mir gerade den Namen der Technik gesagt hast - ich merke, dass ich mit Templates festhalte, hauptsächlich weil ich nicht weiß, was ich googeln soll. Ich schätze es sehr. – OneRaynyDay

Verwandte Themen