Что означают треугольные скобки в С++
Поясните пожалуйсте, что означают треугольные скобки в такой записи:
Iir::ChebyshevI::HighPass<order> f;
и в такой записи:
Iir::ChebyshevI::BandStop<4,Iir::DirectFormI> bs;
Ответы (3 шт):
Опишу в двух словах =) Например если взять машину в качестве примера, то у разных машин есть общие понятия, такие как: наименование, максимальная скорость, количество дверей и т.д
Для этого можно описать класс шаблон
template <typename T>
class Car {
T t; // в этой переменной будет экземпляр той самой характеристики
public:
// Общая функция для всех машин
float getMaxSpeed() {
return t.max_speed;
}
};
Далее опишем классы характеристики машин:
class Volga {
public:
float max_speed = 180;
};
class Moskviche {
public:
float max_speed = 150;
};
Теперь можно создавать класс машины через шаблон:
Car<Volga> * volga = new Car<Volga>();
Car<Moskviche> * moskviche = new Car<Moskviche>();
Вот рабочий пример:
#include <iostream>
template <typename T>
class Car {
T t;
public:
float getMaxSpeed() {
return t.max_speed;
}
};
class Volga {
public:
float max_speed = 180;
};
class Moskviche {
public:
float max_speed = 150;
};
int main()
{
Car<Volga> volga;
Car<Moskviche> moskviche;
std::cout << "volga max speed: " << volga.getMaxSpeed() << "\n";
std::cout << "moskviche max speed: " << moskviche.getMaxSpeed() << "\n";
}
Угловые скобки используются для работы с шаблонами.
Шаблоны помогают абстрагироваться от конкретных типов при создании классов/методов/функций. Перед выполнением, по шаблону автоматические генерируется код, специализированный под указанные в <...> параметры.
Iir::ChebyshevI::HighPass<order> f;
Сгенерирует новый тип HighPass, работающий с типом order.
Iir::ChebyshevI::BandStop<4,Iir::DirectFormI> bs;
Сгенерирует новый тип BandStop, работающий с типом DirectFormI и константой 4.
К примеру, сам шаблон класса BandStop мог бы выглядеть так:
template<size_t CONST_1, typename PAR_2> // аттрибуты шаблонного класса
class BandStop {
int m_IntArray[CONST_1];
PAR_2 m_Object;
}
Для выражения Iir::ChebyshevI::BandStop<4,Iir::DirectFormI> bs; будет сгенерирован новый тип, примерно такого вида.
class BandStop {
int m_IntArray[4];
Iir::DirectFormI m_Object;
}
Допустим я хочу сделать аналогичный тип, который будет работать с другими аргументами. Имея дело с шаблонным классом, не придется объявлять всё вручную.
Я напишу Iir::ChebyshevI::BandStop<42,AnotherClass> bs;, будет сгенерено примерно следующее:
class BandStop {
int m_IntArray[42];
AnotherClass m_Object;
}
Имена новых сгенерированных типов будут уникальны, соотносясь с переданными параметрами шаблона.
PS: код генерируется перед компиляцией и в проект, в качестве исходников, не попадает.