2009-03-28 9 views
21

Traditionell sind die Namen der Template-Typen nur ein einzelner Großbuchstaben:Namenskonventionen für Vorlagentypen?

template<class A, class B, class C> 
class Foo {}; 

Aber ich zögern, dies zu tun, weil es nicht beschreibend und hart deshalb zu lesen. So würde so etwas nicht besser sein:

template<class AtomT, class BioT, class ChemT> 
class Foo {}; 

ich auch zu denken, neigen dazu, die folgenden wäre keine schlechte Idee sein:

template<class ATOM, class BIO, class CHEM> 
class Foo {}; 

Es ihnen heraus stehen lässt (und auch, es ist Ober wieder Buchstaben). Was ist deine Meinung?

Antwort

28

Für C++ Vorlagen I

ein paar Muster haben, wenn es nur ein einziges Template-Parameter ist, nenne ich es T (oder U, V für verschachtelte Vorlagen).

Wenn es mehrere Parameter gibt und die Verwendung nicht sofort offensichtlich ist, dann verwende ich beschreibende Namen mit dem Präfix T. Zum Beispiel TKey, TValue, Tidentifier, etc ... Dies macht die Parameter relativ leicht zu erkennen in der gesamten Template-Nutzung .

Ich würde jedoch die gesamte Großschreibung vermeiden. Die meisten Leute verwenden alle Großbuchstaben in C/C++, um eine Makrodefinition darzustellen. Wiederholt man dieses Muster für einen Template-Parameter, wird das wahrscheinlich die Leute auf der Straße verwirren.

+1

... und könnte den Compiler auch verwirren. Versuchen Sie #include Vorlage Klasse Foo {}; –

+0

Ich verwende T nicht als Präfix, weil es das gleiche Präfix ist, das von einigen Produkten von "Borland" verwendet wird, und für mich ist es ein bisschen verwirrend. – Ismael

+0

Mit dem Präfix T können Sie auch den Namen * ohne Präfix * als generischen Methodennamen (oder jedes andere Symbol im Namensraum) verwenden. Zum Beispiel, ein Accessor 'const TValue & Value() const {Rückgabewert _;}' –

4

Im Allgemeinen ist der traditionelle Weg, T zu verwenden, wenn es nur einen Typ param gibt. Wenn es mehr gibt, verwende T als Präfix, z.B. TAtom. Das Präfix "T" hilft, sofort den Typparameter zu sehen. Die Verwendung von TAtom für einen einzelnen Typparameter ist ebenfalls gültig.

0

Wenn ich Klasse mit einem Parameter vom Typ I Namen T. verwenden es auch bedeuten, dass alle Bedienen in dieser Klasse mit T. arbeiten

Wenn ich einige Parameter habe ich wie in Ihrem explamle AtomT bin Namensgebung , BioT ...
Wenn Vorlagenparameter nicht Objekttyp ist, mit dem wir in Klassen arbeiten, z Strategie, Comparator oder Funktor, benutze ich Namen ohne T z. ThreadStrategie, Vergleichen.

Manchmal, um Mischstile zu vermeiden, mache ich typedefs in Klasse:
typedef T value_type;

-
Boost-Namenskonvention (http://www.boost.org/development/requirements.html#Naming_consistency) sagt über Template-Parameter weiter:
Template Parameternamen beginnen mit einem Großbuchstaben.

1

Sie sollten keine spezielle Namenskonvention für Vorlagen verwenden, verwenden Sie einfach die gleiche Konvention wie für jeden anderen Typ (wie für Klassen oder Variablen). Es sollte im Code keine Rolle spielen, ob Sie mit Schablonentypen/-werten oder normalen Schablonentypen arbeiten.

+0

True für Namen von parametrisierten Typen, Foo , aber die Frage war, Typ-Parameternamen, die T in Vorlage Foo . Es ist also kein Typ, es ist ein Parametername. –

+0

Beachten Sie, dass Typparameter nur durch die Vorlage selbst zugänglich sind, um sie für Benutzer Ihrer Vorlage verfügbar zu machen, müssen Sie sie eingeben (zB 'template ... {typedef FooT Foo;};', also wenn Sie können nur die Standardkonvention verwenden, die Namen können kollidieren –

+0

Hat sich Ihre Meinung seit '09 geändert? Die Leute verwenden 'mName' oder' m_name' für Mitglieder, 'szName' im ungarischen Stil usw. - wenn es Konventionen für Instanzen und Argumente gibt Unterstütze sie, ich verstehe nicht, warum sich diese Argumente nicht auf Templates erstrecken würden. Wenn ein Typ oder der Typ einer Instanz grundlegend anders ist, dann sage ich, dass man für beide Konventionen verwenden sollte. (Meta-Konventionen für die Metaprogrammierung!) –

1

Ich versuche, dem Begriff meines Compiler-Anbieters zu folgen: Er ist nicht zu kurz und nicht zu ausführlich. Und hilft mir, die Fehlermeldungen zu lesen, die ich mit Standardvorlagen bekomme. (Was ein anderer Grund ist, warum ich von const T& zu T const& wechselte).Etwas wie:

template <class Ty, class Container> 
class my_algo { ... 

wo mein Compiler wird in der Regel verwenden:

template <class _Ty, class _Container> 
class std_algo { ... 
+4

Ich denke, Sie wissen das bereits, aber für jeden, der dies liest, beachten Sie, dass er keinen führenden Unterstrich verwendet. Diese sind RESERVIERT für den Compiler. Das heißt, Vorlagen für Standardbibliotheken dürfen _Ty verwenden. Benutzer sind nicht. Ty ist legal, da es nicht mit einem Unterstrich beginnt. – jalf

+0

@jalf: +1. Ausgezeichneter Fang :) Ich war ganz einfach faul, diesen wenig bekannten, aber "kann-komm-zurück-und-dich-bis-später" Punkt zu berühren. – dirkgently

+0

Quod licet Iovi, nicht licet bovi. – Frank

8

I Konvention tname verwenden für die Template-Parameter und Namet für gespeicherte Template-Parameter.

template <typename TFirst, typename TSecond> 
class Templated 
{ 
    typedef TFirst FirstT; 
    typedef TSecond SecondT; 
} 

typedef Templated<int, std::string> MyTemplated; 
... 
const MyTemplated::FirstT size; 
+1

Haha, das ist lustig. – Frank

+0

Mykola, was ist der Punkt ... –

+0

Was ist der Zweck der Speicherung Vorlagenvorlagen? Sie sind anders. Ich habe gerade gezeigt, wie ich diese gespeicherten Typen benenne. Eine Art meiner eigenen Konvention. –

0

Ich folge den gleichen allgemeinen Konventionen Template-Parameter typenames Benennung als I-Klassen & structs folgen zu nennen, die den ersten Buchstaben oder jedes Wort zu nutzen ist, etwa so:

class MyGizmo 
{ 
}; 

struct Thingy 
{ 
}; 

class TPSReport 
{ 
}; 


template<class ValType> ... 

template<typename Number> ... 
1

In unserem Shop , verwenden wir HungF ## ngarian notation. Template-Argumente sind nur Argumente wie alle anderen, außer dass sie keine Konstante, keine Variable, sondern ein Typ sind.

template< typename at_Container, typename at_Functor > 
at_Functor& foreach(const at_Container& ac_Cont, at_Functor& av_Func) { 
    return std::foreach(ac_Cont.begin(), ac_Cont.end(), av_Func); 
} 

Das Präfix beschreibt die Art, während der Name etwas von der Rolle zu sagen, gemeint ist das Argument im Rahmen der definierten Funktion spielt.