Как typedefs работают с шаблонами?

Я просматриваю следующий код в своем проекте, и я не могу понять, как данные хранятся в typedef ниже. Я новичок в C++, поэтому имею ограниченное понимание typedef и шаблонов. Мой поиск хорошего описания таких сценариев дал мало результатов.

Я думаю, что любой typedef, сделанный из squareTemplate, будет иметь 3 значения: площадь, высота и ширина. Но я не уверен, что и <std::vector<std ::pair<******,="" ******="">>,std::vector<std::pair<int, int="">>></std::pair<int,> </std::vector<std> does? У всех 3 typedefs есть переменные области, высоты и ширины? пожалуйста, объясни.

template <class d,="" i="">
struct squareTemplate
{
 I area;
 D height;
 D width;

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

typedef squareTemplate <bool, bool=""> squareValid;

typedef squareTemplate<******, int=""> squareValue;
</******,></bool,></std::pair<int,></std::vector<std></class>
3 ответа

Когда вы вводите typedef AB вы просто говорите, что B - другое имя для A.

У всех 3 typedefs есть переменные области, высоты и ширины?

Да. squareTemplate шаблона squareTemplate определяется как area, height и width и все его экземпляры будут иметь эти элементы. В случае ваших typedefs:

typedef squareTemplate <std::vector<std ::pair<******,="" ******="">>, std::vector<std::pair<int, int="">>> squareRange;
</std::pair<int,></std::vector<std>

area имеет тип, предполагаемый первым параметром шаблона D, поэтому std::vector<std ::pair<******,="" ******="">></std>; То же самое касается height и width - они имеют тип второго аргумента шаблона, std::vector<std::pair<int, int="">></std::pair<int,>

Следуя тем же соображениям, вы получаете:

typedef squareTemplate <bool, bool=""> squareValid;
</bool,>

все они bool

typedef squareTemplate<******, int=""> squareValue;
</******,>

area - int; height и width ******


Шаблонный class - это особый class; вместо предоставления реализации, это в основном шаблон, который компилятор может использовать для создания версий этого class (обычно называемого экземпляром template). В качестве примера можно использовать последний typedef (typedef squareTemplate<******, int=""> squareValue</******,>). Вы в основном получаете код, который является моральным эквивалентом этого:

struct squareTemplate_******_int
{
 int area;
 ****** height;
 ****** width;

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

То же самое происходит и для первых двух typedef: вы получаете уникальные версии squareTemplate для любого шаблона template.


template <class d,="" i="">
struct squareTemplate
{
 I area;
 D height;
 D width;
 ...
}
</class>

Во-первых: это не "настоящий" класс. Это шаблон, который компилятор может использовать для создания классов. Учитывая параметры шаблона class D и class I, компилятор может создать "реальный" класс squareTemplate.

typedef squareTemplate <******, int=""> squareValid;
</******,>

Это говорит, что компилятор "использует шаблон squareTemplate с параметрами шаблона D=****** и I=int для генерации" реального "типа, и мы будем squareValid в squareValid поэтому у нас есть разумное имя для этого типа. И компилятор заполняет вне класса, как будто это было так:

struct squareTemplate_******_int
{
 int area;
 ****** height;
 ****** width;
 ...
}
typedef squareTemplate_******_int squareValid;

Вам не нужны typedefs, вы можете просто использовать их напрямую, если хотите:

void func() {squareTemplate object; } }

Но typedefs может сохранять простые вещи, когда параметры шаблона длинны для ввода:

typedef squareTemplate <std::vector<std ::pair<******,="" ******="">>, std::vector<std::pair<int, int="">>> squareRange;
squareRange object;
</std::pair<int,></std::vector<std>

licensed under cc by-sa 3.0 with attribution.