2009-03-28 16 views
21

Tradicionalmente, los nombres de los tipos de plantilla son apenas una sola letra mayúscula:Convenciones de nomenclatura para tipos de plantilla?

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

Pero dudan en hacer esto porque es no descriptivo y duro, por lo tanto leer. Por lo tanto, no sería algo como esto mejor:

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

También tienden a pensar lo siguiente no sería una mala idea:

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

Esto hace que se destacan (y también, es superior -casas cartas otra vez). ¿Cual es tu opinion?

Respuesta

28

Para plantillas de C++ que tienen un par de patrones

Si hay sólo un único parámetro de plantilla, I nombrarlo T (o U, V para las plantillas anidadas).

Cuando hay varios parámetros y el uso no es inmediatamente obvio, entonces uso nombres descriptivos con el prefijo T. Por ejemplo, TKey, TValue, TIdentifiier, etc ... Esto hace que los parámetros sean fáciles de detectar durante el uso de la plantilla .

Sin embargo, evitaría la versión en mayúsculas. La mayoría de las personas usa todos los identificadores en mayúscula en C/C++ para representar una definición de macro. Repetir ese patrón para un parámetro de plantilla es probable que confunda a las personas en el camino.

+1

... y también podría confundir el compilador. Pruebe #include plantilla clase Foo {}; –

+0

No uso T como prefijo porque es el mismo prefijo usado por algunos productos de "Borland" y para mí es un poco confuso. – Ismael

+0

El prefijo T también le permite usar el nombre * no prefijado * como nombre de método genérico (o cualquier otro símbolo en el espacio de nombres). Por ejemplo, un acceso 'const TValue & Value() const {return value _;}' –

4

Generalmente, la forma tradicional es usar T si solo hay un tipo de param. Si hay más, use T como prefijo, p. TAtom. El prefijo "T" ayuda a ver instantáneamente su parámetro de tipo. Usar TAtom para un parámetro de tipo único también es válido.

0

Si tengo clase con un parámetro de tipo I estoy usando nombre de T. También significa que todos operartion en esta clase están trabajando con T.

Si tengo unos pocos parámetros que estoy nombrando como en su AtomT explamle , BioT ...
Si el parámetro de la plantilla no es el tipo de objeto con el que trabajamos en clas eg estrategia, comaparator o funtor, uso el nombre sin T, p. ej. ThreadStrategy, Compare.

A veces para evitar mezclar estilos Estoy haciendo typedefs en clase:
typedef T value_type;

-
Boost convención de nomenclatura (http://www.boost.org/development/requirements.html#Naming_consistency) dice acerca de los parámetros de plantilla siguientes:
nombres de los parámetros de plantilla comienzan con una letra mayúscula.

1

No debe usar una convención de nomenclatura especial para plantillas, solo use la misma convención que para cualquier otro tipo (como para clases o variables). No debería importar en el código si está trabajando con tipos/valores de plantilla o normales.

+0

True para nombres de tipos parametrizados, Foo , pero la pregunta era sobre nombres de parámetros de tipo, la T en la plantilla Foo . Entonces no es un tipo, es un nombre de parámetro. –

+0

Tenga en cuenta que solo la plantilla puede acceder a los parámetros de tipo, para que estén disponibles para los usuarios de su plantilla, debe escribirlos (por ejemplo, 'template ... {typedef FooT Foo;};', por lo que solo usa la convención estándar, los nombres pueden entrar en conflicto –

+0

¿Ha cambiado su opinión desde '09? La gente usa 'mName' o' m_name' para miembros, 'szName' en estilo húngaro, etc. - si hay convenciones para instancias y argumentos para apóyalos, no veo por qué esos argumentos no se extenderían a las plantillas. Si un tipo o el tipo de una instancia es fundamentalmente diferente, te digo que deberías usar convenciones para ambos o ninguno (¡metaconvenciones para la metaprogramación!) –

1

Intento seguir la idea que usa mi compilador: no es demasiado corto y no es demasiado detallado. Y me ayuda a leer los mensajes de error que recibo con las plantillas estándar. (Que es otra razón por la que cambié de const T& a T const&).Algo así como:

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

donde mi compilador suele utilizar:

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

Creo que ya lo sabe, pero para cualquier otra persona que lea esto, tenga en cuenta que no usa un guion bajo. Esos están RESERVADOS para el compilador. Es decir, las plantillas de biblioteca estándar pueden usar _Ty. Los usuarios no son Ty es legal, ya que no comienza con un guión bajo. – jalf

+0

@jalf: +1. Excelente captura :) Estaba siendo un flojo perezoso para tocar este punto poco conocido pero que '' puede volver y morderme más tarde ''. – dirkgently

+0

Quod licet Iovi, non licet bovi. – Frank

8

utilizo convención TNAME para el parámetro de plantilla y Namet para el parámetro de plantilla almacenada.

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

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

Jaja, eso es gracioso. – Frank

+0

Mykola, ¿cuál es el punto ... –

+0

¿De qué sirve almacenar tipos de plantillas? Ellos son diferentes. Acabo de mostrar cómo nombro esos tipos almacenados. Tipo de mi propia convención. –

0

que siguen las mismas convenciones de denominación generales typenames parámetro de plantilla como yo sigo nombrando clases & estructuras, que es capitalizar la primera letra o cada palabra, así:

class MyGizmo 
{ 
}; 

struct Thingy 
{ 
}; 

class TPSReport 
{ 
}; 


template<class ValType> ... 

template<typename Number> ... 
1

En nuestra tienda , usamos la notación de HungF ## ngarian. Los argumentos de plantilla son solo argumentos como todos los demás, excepto que no son un const, ni una variable, sino un tipo.

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

El prefijo describe el tipo, mientras que el nombre es para decir algo del papel juega el argumento en el contexto de la función definida.

Cuestiones relacionadas