2012-03-09 10 views
33
template<typename T> 
class Point 
{ 
public: 
    typedef T value_type; 
    ... 
}; 

He visto el código anterior en book, pp176.¿Es una buena práctica definir siempre `value_type` cuando definimos una plantilla

Pregunta1> ¿Es una buena práctica agregar siempre la definición de value_type?

Pregunta 2> ¿Dónde se usará este value_type definido?

Por ejemplo:

Point<int>::value_type?

+8

+1 para comprar un libro de C++ adecuado, y luego hacer una pregunta razonable – Joe

+2

Triste que es tan raro hoy en día. –

Respuesta

15

No daño tener uno, pero en su mayoría sólo tiene sentido para contenedores (como std::vector), como todos los contenedores proporcionan esta typedef y una interfaz uniforme para acceder a los valores contenidos (begin/end, front/back), aunque esto se ha vuelto obsoleto en C++ 11 con auto y decltype. Todavía está más limpio decir some_template<typename container::value_type> ..., sin embargo.

Eso a su vez significa que se pueden usar indistintamente en código genérico (la razón principal por la que las cosas se hicieron de esa manera). Si tiene sentido para su clase Point saber qué tipos son los valores contenidos, bueno, tenga ese typedef. Como dije, no duele. Sin embargo, tengo la sensación de que no tiene demasiado sentido para ese ejemplo en particular.

5

Es una buena práctica para escribir funciones que funcionan en contenedores. Por ejemplo, si escribí una función swap que acepta un contenedor (plantilla) y dos índices para intercambiar, entonces podría usar la definición value_type para definir una variable temporal.

template<typename T> 
void swap(T &container, int i, int j) { 
    typename T::value_type temp = container[i]; 
    container[i] = container[j]; 
    container[i] = temp; 
} 
+2

Y en C++ 11, eso sería 'auto'. :) Tenga en cuenta que este es un mal ejemplo de 'swap', pero adecuado para typedefs' value_type' anidados. – Xeo

1

Yo diría que solo si tiene sentido para el tipo. Me encontré con problemas donde value_type se interpone porque un algoritmo genérico erróneamente asume que es un contenedor de algún tipo (en mi caso, me parece recordar que fue algún algoritmo en boost que asumió que shared_ptr era un contenedor multi artículo debido a value_type está presente).

Cuestiones relacionadas