2016-12-27 1 views
1

Es ist gängige Praxis declarate mit/typedef der aktuellen Art innerhalb einer Template-Klasse:C++ Name Stromart innerhalb Vorlage

template <typename T1, typename T2 = std::vector<T1>, typename Allocator> 
class my_class { 
    //... 
public: 
    using my_class_t = my_class<T1, T2, Allocator>; //1 
    my_class_t operator()(); //2 
    //... 
} 

ich alleine habe bemerkt, dass es sehr komfortable Lösung ist, zu schreiben dass mit() zu verhindern, dass komplizierte Art jedes Mal neu schreiben - z zeigt, dass es viel einfacher gemacht werden kann. Meine Fragen:

  • Gibt es eine dokumentierte Konvention was apriopriate Name für diesen Typ ist (type, my_class_t, ...)?
  • Gibt es irgendeine Methode, um diese Deklaration zu erleichtern (etwas wie vordefiniert this_t, vielleicht in neuen Standards)?
+0

Viele Klassen in der Standardbibliothek tut dies geschrieben worden sein könnte, so ja, ich würde sagen, es ist durchaus üblich. Siehe z.B. der Abschnitt [Member-Typen dieser Referenz »std :: vector«] (http://en.cppreference.com/w/cpp/container/vector#Member_types). –

+2

** 2 ** ist kein gutes Beispiel, da Sie 'my_class' einfach ohne Argumente für das exakt gleiche Ergebnis verwenden können. Aber ich stimme zu, dass es Fälle gibt, in denen es nützlich ist. –

+0

Innerhalb einer Klassenvorlage können Sie einfach den Namen verwenden, d. H. Ihr 'using'-Alias ​​könnte als' using my_class_t = my_class' geschrieben worden sein. –

Antwort

2

Ich bin mir keiner Konvention bewusst, die einen Namen einer Klasse in der Klasse selbst angibt. Da jeder, der sich außerhalb der Klassendefinition befindet, den Typ irgendwie formulieren muss, bevor er auf den verschachtelten verschachtelten Namen zugreifen kann, scheint er für externe Benutzer nicht notwendig zu sein.

Für den Zweck der Klassendefinition selbst kann nützlich sein. Es gibt eine Kurzform für den Zugriff auf die Instanziierung innerhalb der Klassenvorlagendefinition oder innerhalb der Elementdefinitionen: Sie können einfach den Namen der Vorlage verwenden. Das heißt, Ihre using alias als

using my_class_t = my_class; 
Verwandte Themen