Могу ли я объявлять только шаблоны в файле заголовка для другой программы? - PullRequest
0 голосов
/ 08 октября 2009

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

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

или, по крайней мере, есть хоть какой-то способ спасти мой трудоемкий, потраченный час, код от других?

(я буду использовать stl-векторы и тому подобное, но я прошу свой собственный код ... Шаблоны кажутся хорошими, спасают вас много жестко закодированных строк или злоупотреблений макросами, но если другие могут прочитать ваш источник, чем это делает почти нет смысла [много смысла открывать проекты xD])

Спасибо, Джо

Ответы [ 3 ]

4 голосов
/ 08 октября 2009

Если вы хотите, чтобы пользователи вашей библиотеки могли использовать ваши шаблоны, их исходный код должен быть доступен для этих пользователей.

Однако вы можете иногда проектировать свои классы шаблонов так, чтобы большая часть логики происходила в не шаблонных классах, которые не имеют полного исходного кода в заголовках.

2 голосов
/ 08 октября 2009

Это зависит от того, являются ли ваши шаблоны частью интерфейса вашей библиотеки или они просто являются частью реализации.

Если они являются частью интерфейса (т. Е. Возможно, точка входа возвращает объект определенного типа шаблона), то да, вам нужно представить определения вашего шаблона внешнему миру.

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

0 голосов
/ 08 октября 2009

Вы можете написать шаблоны как обертки вокруг не шаблонного (часто нетипичного) кода.

Преимущества ...

  1. Не нужно распространять исходный код реализации без шаблона.
  2. Это хороший способ уменьшить раздувание шаблона.

Очевидными недостатками является то, что у вас есть дополнительный уровень абстракции и служебных данных, и нетипичный код реализации, очевидно, требует некоторой осторожности. Я склонен иметь абстрактный класс 'tool', определенный в не шаблонном коде, специализирующийся на обертке шаблона. Я называю это инструментом, потому что методы в первую очередь воздействуют не на состояние инструментов, а на объекты, передаваемые как параметры void *. Класс инструмента инкапсулируется как большинство проблем безопасности типов в нескольких методах. Шаблон также предоставляет типизированную оболочку, которую фактически используют пользователи, которая взаимодействует с небезопасным кодом, предоставляет экземпляр инструмента и выполняет типы типов и т. Д.

Например, если я реализую древовидную структуру данных, большинство алгоритмов дерева будут небезопасными по типу и будут видеть узлы и элементы данных как пустые * указатели (или, возможно, указатели на узлы * и данные * с объявленным узлом и данными) но неопределенные структуры). У меня будет абстрактная база инструментов дерева с чистыми методами для создания, удаления и других базовых операций, а шаблон оболочки будет в основном специализироваться на инструменте дерева, предоставляя реализации методов, которые знают точные типы узлов и элементов данных, и удерживая экземпляр инструмента в качестве члена класса. Для пользователя оболочка - это просто безопасный контейнер, такой же, как и любой другой.

Кстати: при реализации оболочки шаблона следите за зависимым именем выпусков.

...