2009-03-28 18 views
21

Tradycyjnie nazwy typów szablonów, to tylko jeden górny literę:Konwencje nazewnictwa dla typów szablonów?

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

Ale waham się tego zrobić, bo to non-opisowe i twarde zatem czytać. Tak, to nie coś takiego być lepiej:

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

ja również tendencję do myślenia, co następuje nie byłoby złym pomysłem:

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

To sprawia, że ​​wyróżniają się (a także, to górny -case litery ponownie). Jaka jest Twoja opinia?

Odpowiedz

28

Dla Szablony C++ Mam kilka wzorów

Jeśli jest tylko jeden parametr szablon, nazwać go T (lub U, V dla zagnieżdżonych szablonów).

Gdy istnieje wiele parametrów i użycie nie jest od razu oczywiste, używam opisowych nazw poprzedzonych prefiksem T. Na przykład: TKey, TValue, TIdentifiier, etc ... To sprawia, że ​​parametry są dość łatwe do wykrycia w całym użyciu szablonu .

Chciałbym jednak uniknąć wersji wszystkich wielkich liter. Większość ludzi używa wszystkich wielkich liter identyfikatorów w C/C++ do reprezentowania definicji makra. Powtarzanie tego wzorca parametru szablonu może wprowadzić użytkowników w błąd.

+1

... i może również mylić kompilator. Wypróbuj #include szablon klasa Foo {}; –

+0

Nie używam T jako prefiksu, ponieważ jest to ten sam prefiks używany przez niektóre produkty z "Borland" i dla mnie jest to nieco mylące. – Ismael

+0

Prefiks T umożliwia także użycie * nieusuniętej * nazwy jako ogólnej nazwy metody (lub dowolnego innego symbolu w przestrzeni nazw). Na przykład accessor 'const TValue & Value() const {return value _;}' –

4

Ogólnie rzecz biorąc, tradycyjny sposób polega na użyciu T, jeśli istnieje tylko jeden typ parametru. Jeśli jest więcej, użyj T jako prefiksu, np. TAtom. Prefiks "T" pomaga od razu zobaczyć jego parametr typu. Używanie TAtom dla pojedynczego parametru jest również poprawne.

0

Jeśli mam klasy z jednego parametru typu używam nazw T. Także to znaczy, że wszystko w tej klasie operartion pracują z T.

Jeśli mam kilka parametr jestem nazewnictwa jak w explamle AtomT , BioT ...
Jeśli parametr szablonu nie jest typem obiektu, z którym pracujemy w klasach np. strategia, programista lub funktor, używam nazwy bez T, np. ThreadStrategy, Porównaj.

Czasami unikam mieszania stylów Tworzę typedefs w klasie:
typedef T typ wartości;

-
doładowania konwencji nazewnictwa (http://www.boost.org/development/requirements.html#Naming_consistency) mówi o parametrach szablonu Dalej:
nazwy parametrów szablonu zaczynają się wielką literą.

1

Nie powinieneś używać specjalnej konwencji nazewnictwa dla szablonów, wystarczy użyć tej samej konwencji, co dla każdego innego typu (tak jak w przypadku klas lub zmiennych). W kodzie nie powinno mieć znaczenia, czy pracujesz z typami/wartościami szablonów, czy z normalnymi.

+0

True dla nazw sparametryzowanych typów, Foo , ale pytanie dotyczyło nazw parametrów typów, T w szablonie Foo . Więc to nie jest typ, to nazwa parametru. –

+0

Zauważ, że parametry typu są dostępne tylko dla samego szablonu, aby udostępnić je użytkownikom szablonu, musisz je wpisać (np. 'Szablon ... {typedef FooT Foo;};', więc jeśli używasz standardowej konwencji, nazwy mogą kolidować –

+0

Czy twoja opinia zmieniła się od '09? Ludzie używają 'mName' lub' m_name' dla członków, 'szName' w węgierskim stylu itd. - jeśli są konwencje dla instancji i argumentów do popieram je, nie rozumiem, dlaczego te argumenty nie rozciągnęłyby się na szablony.Jeśli typ lub typ instancji jest zasadniczo różny, mówię, że powinieneś używać konwencji dla obu lub nie. (Meta-konwencje dla metaprogramowania!) –

1

Próbuję zastosować się do pojęcia, którego używa mój producent kompilatorów: nie jest on zbyt krótki i nie jest zbyt szczegółowy. I pomaga mi odczytać komunikaty o błędach, które otrzymuję za pomocą standardowych szablonów. (Co jest kolejnym powodem, dla którego przełączyłem się z const T& na T const&).Coś jak:

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

gdzie mój kompilator zwykle zastosowanie:

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

Myślę, że już to wiesz, ale dla każdego, kto to czyta, pamiętaj, że nie używa on wiodącego podkreślenia. Są ZASTRZEŻONE dla kompilatora. Oznacza to, że standardowe szablony bibliotek mogą używać _Ty. Użytkownicy nie są. Ty jest legalny, ponieważ nie zaczyna się od podkreślenia. – jalf

+0

@jalf: +1. Znakomity połów :) Byłem leniwy, by dotknąć tego mało znanego, ale "powracającego i odgryzionego" punktu. – dirkgently

+0

Quod licet Iovi, non licet bovi. – Frank

8

używam konwencja tname parametru szablonu i Namet dla przechowywanej parametru szablonu.

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, to zabawne. – Frank

+0

Mykola, o co chodzi ... –

+0

Jaki jest sens przechowywania szablonów? Oni są różni. Po prostu pokazałem, jak nazywam te zapisane typy. Rodzaj mojej własnej konwencji. –

0

śledzę te same ogólne konwencje nazewnictwa typenames parametr szablonu jak śledzę nazewnictwa klas & przypisać struktury, która jest pierwszą literę lub każde słowo, tak jak poniżej:

class MyGizmo 
{ 
}; 

struct Thingy 
{ 
}; 

class TPSReport 
{ 
}; 


template<class ValType> ... 

template<typename Number> ... 
1

w naszym sklepie używamy notacji Hungar ## ngarian. Argumenty szablonu są po prostu argumentami, jak wszystkie inne, z wyjątkiem tego, że nie są const, ani zmienną, ale typem.

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

Przedrostek opisuje typ, podczas gdy nazwa ma coś powiedzieć o roli argument odgrywa w kontekście określonej funkcji.