Каковы хорошие и плохие моменты шаблонов на С++?
Я разговаривал с друзьями, а некоторые полностью согласны с тем, что шаблоны на С++ должны использоваться, другие не согласны полностью.
Некоторые из хороших вещей:
- Они более безопасны в использовании (тип безопасности).
- Это хороший способ сделать обобщения для API.
Какие еще хорошие вещи вы можете рассказать мне о шаблонах С++?
Какие плохие вещи вы можете рассказать мне о шаблонах С++?
Изменить: Одна из причин, почему я спрашиваю об этом, это то, что я изучаю экзамен, и на данный момент я освещаю тему шаблонов С++. Поэтому я пытаюсь понять немного больше о них.
Ответы
Ответ 1
Шаблоны - это очень мощный механизм, который может упростить многие вещи. Однако для их правильного использования требуется много времени и опыта - чтобы решить, когда их использовать целесообразно.
Для меня наиболее важными преимуществами являются:
- сокращение повторения кода (общие контейнеры, алгоритмы)
- сокращение повторения расширенного кода (MPL и Fusion)
- статический полиморфизм (= производительность) и другие вычисления времени компиляции
- разработка на основе политики (гибкость, возможность повторного использования, более легкие изменения и т.д.)
- повышение безопасности без затрат (т.е. анализ измерений с помощью бустеров, статических утверждений, концептуальных проверок)
- функциональное программирование (Phoenix), ленивая оценка, шаблоны выражений (мы можем создавать специфичные для домена встроенные языки в C++, у нас есть отличная библиотека Proto, у нас есть Blitz++)
- другие менее впечатляющие инструменты и приемы, используемые в повседневной жизни:
- STL и алгоритмы (какая разница между
for
и for_each
) - bind, lambda (или Phoenix) (напишите более понятный код, упростите вещи)
- Функция Boost (облегчает написание обратных вызовов)
- кортежи (как вообще хешировать кортеж? Используйте Fusion, например...)
- TBB (
parallel_for
и другие STL-подобные алгоритмы и контейнеры)
- Можете ли вы представить C++ без шаблонов? Да, я могу, в ранние времена вы не могли использовать их из-за ограничений компилятора.
- Вы бы написали в C++ без шаблонов? Нет, я бы потерял многие из упомянутых выше преимуществ.
Недостатки:
- Время компиляции (например, добавьте Sprit, Phoenix, MPL и немного Fusion, и вы можете пойти на кофе)
- Люди, которые могут использовать и понимать шаблоны, не так часто (и эти люди полезны)
- Люди, которые думают, что они могут использовать и понимать шаблоны, встречаются довольно часто (и эти люди опасны, поскольку они могут чертовски из вашего кода. Однако большинство из них после некоторого обучения/наставничества присоединятся к группе, упомянутой в предыдущем пункте)
- поддержка
export
шаблонов (отсутствие) - сообщения об ошибках могут быть менее загадочными (после некоторого изучения вы можете найти то, что вам нужно, но все же...)
Я настоятельно рекомендую следующие книги:
Ответ 2
С положительной стороны, шаблоны С++:
-
Разрешить обобщение типа
-
Уменьшите объем избыточного кода, который вам нужно ввести
-
Помогите создать безопасный код
-
Оцениваются во время компиляции
-
Может увеличить производительность (в качестве альтернативы полиморфизму)
-
Помогите создать очень мощные библиотеки
С отрицательной стороны:
-
Может быть сложным быстро, если вы не будете осторожны.
-
Большинство компиляторов выдают критические сообщения об ошибках
-
Трудно использовать/отлаживать высокотемпературный код
-
По крайней мере, один синтаксический причуд (оператор → может вмешиваться в шаблоны)
-
Помогите сделать С++ очень сложно разобрать
В целом, следует внимательно рассмотреть вопрос о том, когда использовать шаблоны.
Ответ 3
Мои 2с довольно негативные.
Типы C++ никогда не были предназначены для выполнения вычислений времени компиляции. Понятие использования типов для достижения вычислительных целей очень очевидно - взлом, и, более того, тот, который никогда не искал, а скорее наткнулся на
..
Награда за использование MP в вашем коде - это момент удовлетворения разгадки трудной загадки. Вы сделали вещи в 100 строк, которые в противном случае заняли бы 200. Вы пробились через непонятные сообщения об ошибках, чтобы добраться до точки, где, если бы вам нужно было расширить код до нового случая, вы бы знали точную трехстрочную функцию шаблона для перегрузки. Ваши сопровождающие, конечно, должны были бы вкладывать бесконечно больше, чтобы достичь того же.
Ответ 4
Хорошие моменты: мощный; позволяет:
- предписывать атрибуты и вычисления времени компиляции
- описать общие алгоритмы и структуры данных
- делать много других вещей, которые в противном случае были бы повторяющимися, скучными и склонными к ошибкам
- делает их на языке, без макросов (что может быть гораздо более опасным и неясным!)
Плохие очки: мощный; позволяет:
- вызывать ошибки времени компиляции, которые являются подробными, вводящими в заблуждение и неясными (хотя и не такими неясными и вводящими в заблуждение как макросы...)
- создавать неясные и опасные ошибки (хотя и не так легко, как макросы...)
- вызвать код раздувания, если вы не будете осторожны (как и макросы!)
Шаблоны значительно увеличивают жизнеспособное пространство дизайна, что не обязательно плохо, но это делает их намного сложнее использовать. Код шаблона нуждается в поддерживающих лицах, которые понимают не только языковые особенности, но и конструктивные последствия особенностей языка; практически говоря, это означает, что многие группы разработчиков избегают всех, кроме самых простых и наиболее институционализированных приложений шаблонов С++.
В общем, шаблоны делают язык намного сложнее (и его сложно реализовать правильно!). Шаблоны не были специально предназначены для того, чтобы быть Тьюрингом, но они все равно - таким образом, хотя они могут делать что угодно, использование их может оказаться более сложным, чем это стоит.
Ответ 5
Шаблоны следует использовать экономно.
"Ужасно отлаживать" и "трудно читать" не являются отличными аргументами против хороших применений шаблонов с хорошими абстракциями.
Лучшие отрицательные аргументы будут направлены на то, что STL имеет много "gotchas" и использует шаблоны для целей, которые STL уже охватывает, - это изобретать колесо. Шаблоны также увеличивают время ссылки, что может быть проблемой для некоторых проектов, и имеют много особенностей в их синтаксисе, которые могут быть тайными для людей.
Но позитивы с повторным использованием общего кода, чертами типа, отражением, интеллектуальными указателями и даже метапрограммами часто перевешивают негативы. Вы должны быть уверены в том, что шаблоны всегда используются осторожно и экономно. Они не лучшее решение в каждом случае, и часто даже не второе или третье лучшее решение.
Вам нужны люди с достаточным опытом написания их, чтобы они могли избежать всех ловушек и иметь хороший радар, когда шаблоны усложнят что-то большее, чем помогают.
Ответ 6
Я не понимаю, как их трудно читать. Что нечитаемо о
vector <string> names;
например? Что бы вы его заменили?
Ответ 7
Одним из недостатков, о которых я еще не упоминал, являются тонкие смысловые различия между регулярными классами и экземплярами шаблонов классов. Я могу думать:
-
typedef
ed typenames в типах предков не наследуются классами шаблонов.
- Необходимо посыпать ключевые слова
typename
и template
в соответствующих местах.
- Шаблоны-члены-члены не могут быть
virtual
.
Эти вещи обычно можно преодолеть, но это боль.
Ответ 8
Некоторые люди ненавидят шаблоны (я делаю), потому что:
- При ремонтопригодности неправильное использование шаблонов может иметь отрицательный эффект в десять раз сильнее, чем первоначальное преимущество времени, которое они должны были принести.
- При оптимизации pov оптимизация компилятора, которую они позволяют, ничем не отличается от оптимального алгоритма и использования многопоточности.
- При компиляции времени pov неправильное использование шаблонов может оказать очень негативное влияние на фазы синтаксического анализа, компиляции и связывания, когда плохо написанная шаблонная декларация приносит тонны бесполезных деклараций паразитов в каждом блоке компиляции (вот как может выглядеть 200 строк кода .obj 1Mb).
Мне шаблоны похожи на бензопилу с интегрированным огнеметом, который также может запускать гранаты. Один раз в жизни у меня может быть определенная потребность в этом. Но большую часть времени я использую обычный молоток и простую пилу для создания вещей, и я делаю очень хорошую работу таким образом.
Ответ 9
Преимущество: могут быть созданы общие типы данных.
Недостаток: кодовое раздувание
Ответ 10
#include <iostream>
#include <sstream>
using namespace std;
//simple implimentation using template class
template<class C, typename T, typename K>
class App {
public:
App(C c, T t, K k) : c { c }, t { t }, k {k} {
//not the best way but anyway its just an implimentation
stringstream ss(c);
ss >> t;
t=t-1;
t=t*k;
cout << t << endl;
}
virtual ~App() {}
private:
C c;
T t;
K k;
};
int main() {
//can one use unique pointers and how?
App<string, int, int> app("10", 0, 3);
return 0;
}
Ответ 11
Многоразовый код создается с помощью шаблона. Его применение соответствует профилю каждого.