Что такое шаблоны в C ++ - PullRequest
1 голос
/ 21 мая 2011

Может кто-нибудь объяснить это в простом формате?

Есть шаблонные функции и шаблонные классы. Какие преимущества и недостатки? Я слышал, что шаблоны создаются медленно и даже во время выполнения?

Правда?

Thx

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

В C ++ у вас есть возможность перегружать функции, например:

void do_something(object1 ob);
void do_something(int i);

Что ж, шаблоны позволяют вам создавать «универсальные» функции или классы, которые принимают произвольные типы.Поэтому вместо определения функции каждый раз, когда вы добавляете тип, вы можете определить его один раз и позволить компилятору «написать» все функции для вас.

template<typename T>
void do_something(T arg);

С помощью классов вы создаете варианты, основанные на различиях типов,Лучший пример, который я могу придумать, это std :: vector .. вы можете думать о нем как о контейнере / массиве / о чем угодно.Но вам нужно определить начальный тип (чтобы он знал, насколько велик каждый элемент, как копировать каждый элемент и т. Д.):

std::vector<int> vector_of_ints;
std::vector< std::string > vector_of_strings;
...

Потому что, в действительности, компилятор записываетдополнительные функции для вас во время компиляции, не должно быть никакого эффекта времени выполнения.Однако может возникнуть проблема во время выполнения, когда у вас так много шаблонного кода, что приводит к раздутию в коде, и это может привести к отсутствию кэша выполнения ... но на современном оборудовании это не должно быть проблемой.

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

0 голосов
/ 21 мая 2011

Подведем итог:

Если вы пишете функцию add (int a, int b)? Разве не было бы неплохо, если бы ваше дополнение могло сделать это для всех типов данных? Не просто int без необходимости делать более 1 функции? Вот где шаблоны приходят. Они делают это так, что вам нужна только одна функция для инкапсуляции многих типов.

Это будет, как вы делаете функцию:

template<typename T>
T add(T a, T b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...