Я использовал шаблоны иногда на протяжении многих лет. Они могут быть удобны, но с профессиональной точки зрения, я от них отклоняюсь. Две из причин:
1
Необходимость либо: а) раскрыть определения функций (а не только объявления) «исходного» кода для кода «где используется» или б) создать фиктивную инстанцирование в исходном файле. Это необходимо для компиляции. Вариант а.) Может быть сделан путем определения функций в заголовке или фактического включения cpp.
Одна из причин того, что мы допускаем заголовки в C ++ (по сравнению, например, с C #), заключается в отделении «интерфейса» от «реализации». Что ж, шаблоны кажутся несовместимыми с этой философией.
2
Функции, вызываемые экземпляром параметра типа шаблона, могут не выполняться во время компиляции, что приводит к ошибкам соединения. Например. Т пример; example.CompilerDoesntKnowIfThisFunctionExistsOnT ();
Это "свободный" ИМХО.
Решения:
Вместо шаблонов я склоняюсь к использованию базового класса, благодаря которому производные / контейнерные классы знают, что доступно во время компиляции. Базовые классы могут предоставлять универсальные методы и «типы», для которых часто используются шаблоны. Вот почему доступность исходного кода может быть полезна, если необходимо изменить существующий код для вставки базового базового класса в иерархию наследования, где это необходимо. В противном случае, если код является закрытым исходным кодом, лучше переписать его, используя общие базовые классы, а не использовать шаблон в качестве обходного пути.
Если тип не важен, например, vector , тогда как насчет использования «объекта». C ++ не предоставил ключевое слово «object», и я предложил д-ру Bjarne Stroustrup, что это было бы полезно, особенно для того, чтобы сообщить компилятору и людям, читающим код, этот тип не важен (для случаев, когда это не так). Я не думаю, что C ++ 11 имеет это, может быть, C ++ 14 будет?