Estoy mirando el siguiente código en mi proyecto y parece que no puedo entender cómo se almacenan los datos en el typedef a continuación. Soy nuevo en C ++, así que tengo una comprensión limitada de typedef y plantillas. Mi búsqueda de una buena descripción de tales escenarios ha arrojado pocos resultados.

Mi pensamiento es que cualquier typedef hecho de squareTemplate tendría los 3 valores: área, altura y ancho. Pero no estoy seguro de qué demonios <bool, bool> y <std::vector<std ::pair<double, double>>,std::vector<std::pair<int, int>>> ¿hace? ¿Los 3 typedefs contienen variables de área, altura y ancho? por favor explique.

template <Class D, Class I>
struct squareTemplate
{
    I area;
    D height;
    D width;

   squareTemplate() :
    area(),
    height(),
    width()
    {
    }
};
typedef squareTemplate <std::vector<std ::pair<double, double>>, std::vector<std::pair<int, int>>> squareRange;

typedef squareTemplate <bool, bool> squareValid;

typedef squareTemplate<double, int> squareValue;
2
JavaBeast 7 mar. 2018 a las 04:46

3 respuestas

La mejor respuesta

Cuando typedef A B simplemente estás diciendo que B es otro nombre para A.

¿Los 3 typedefs contienen variables de área, altura y ancho?

Si. La clase de plantilla squareTemplate se define para tener area, height y width y todas sus instancias tendrán esos miembros. En el caso de sus typedefs:

typedef squareTemplate <std::vector<std ::pair<double, double>>, std::vector<std::pair<int, int>>> squareRange;

area tiene el tipo asumido por el primer parámetro de plantilla D, entonces std::vector<std ::pair<double, double>>; Lo mismo ocurre con height y width: tienen el tipo del segundo argumento de plantilla, std::vector<std::pair<int, int>>

Siguiendo el mismo razonamiento, obtienes:

typedef squareTemplate <bool, bool> squareValid;

Todas ellas son bool

typedef squareTemplate<double, int> squareValue;

area es int; height y width son double

4
ricab 7 mar. 2018 a las 02:07
template <Class D, Class I>
struct squareTemplate
{
    I area;
    D height;
    D width;
    ...
}

Primero: Esta no es una clase "real". Esta es una plantilla que el compilador puede usar para hacer clases. Dados los parámetros de plantilla class D y class I, el compilador puede generar una clase "real" squareTemplate.

typedef squareTemplate <double, int> squareValid;

Esto le dice al compilador que "use la plantilla squareTemplate con los parámetros de plantilla D=double y I=int para generar un tipo" real ", y lo definiremos como squareValid para que podamos tiene un nombre razonable para este tipo. Y el compilador llena la clase como si fuera así:

struct squareTemplate_double_int
{
    int area;
    double height;
    double width;
    ...
}
typedef squareTemplate_double_int squareValid;

No necesita typedefs, solo puede usarlos directamente si lo desea:

Voc func () {objeto squareTemplate; }

Pero typedefs puede mantener las cosas simples cuando los parámetros de la plantilla son largos para escribir:

typedef squareTemplate <std::vector<std ::pair<double, double>>, std::vector<std::pair<int, int>>> squareRange;
squareRange object;
0
Mooing Duck 7 mar. 2018 a las 02:21

Un class con plantilla es un tipo especial de class; en lugar de proporcionar una implementación, es básicamente un patrón que el compilador puede seguir para crear versiones de ese class (generalmente llamado instanciar el template). Usemos el último typedef (typedef squareTemplate<double, int> squareValue) como ejemplo. Básicamente obtienes código que es el equivalente moral de esto:

struct squareTemplate_double_int
{
    int area;
    double height;
    double width;

   squareTemplate() :
    area(),
    height(),
    width()
    {
    }
};

Lo mismo sucede también para los primeros dos typedef s: obtienes versiones únicas de squareTemplate para cualquier patrón dado de tipos template.

1
Stephen Newell 7 mar. 2018 a las 02:01