Желательно ли выставить шаблонный класс библиотеки? - PullRequest
4 голосов
/ 20 мая 2011

Я занимаюсь разработкой библиотеки для матричных вычислений на C ++.Для этого я хотел использовать шаблоны.После небольшого метапрограммирования шаблона я понял, что в конечном итоге я представлю свои реализации в шаблоне Matlat Templatise. Есть ли способ скрыть реализацию класса шаблона в файле заголовка, когда вы предоставляете этот конкретный класс шаблона?Если да, то как это сделать?

Ответы [ 7 ]

5 голосов
/ 20 мая 2011

Я отвечу с точки зрения клиента.

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

Это не потому, что я хочу вырвать это у автора ... Это не потому, что я беззаконник и хакер независимо ...

Это просто, потому что:

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

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

Честно говоря, если у меня есть выбор между двумя библиотеками, и одна не раскрывает свой код, я буду склоняться к другой, если разница в производительности / корректности действительно не важна.

(*) В C ++ в Boost есть библиотеки, которые я считаю принципиально неработоспособными в этом отношении. Код изобилует обходными путями компилятора, что делает его очень трудным для чтения. Тем не менее, я использую их, потому что они просто потрясающие.

4 голосов
/ 20 мая 2011

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

4 голосов
/ 20 мая 2011

С текущим стандартом (и даже с выходом C ++ 11) нужно раскрыть все определения template, где используются эти шаблоны.Не существует стандартного способа скрыть это.

Вторая часть, если вы решите обфусцировать , то в равной степени его использование станет сложным.На мой взгляд, лучший способ - это лицензия / авторское право их!

1 голос
/ 20 мая 2011

В дополнение ко всем другим приведенным причинам есть еще одна проблема: имена C ++ «декорированы» - например, для поддержки перегрузок метода типы параметров для метода кодируются в имени метода.

Стандарт для этой кодировки не существует, он варьируется от компилятора к компилятору и даже от одной версии компилятора к другой версии того же компилятора.

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

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

1 голос
/ 20 мая 2011

Я думаю, что все библиотеки C ++ на основе шаблонов развертываются как файлы заголовков (возможно, также с использованием библиотек, но общедоступные шаблоны должны быть заголовками)Это верно для STL, boost и т. Д. Это просто способ работы шаблонов - компилятор должен видеть оригинальный шаблон.

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

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

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

Нет, не совсем, поскольку шаблон не является скомпилированным кодом.Это буквально «шаблон».Когда шаблон создается в файле .cpp, сам шаблон должен быть доступен компилятору для генерации кода для метода класса.Поэтому вы не можете «спрятать» код шаблона ... он должен быть доступен для компилятора, иначе вы не сможете скомпилировать какие-либо модули, которые пытаются создать экземпляр шаблона.Представление о шаблонах похоже на пустую форму, которую вы можете использовать, скажем, для подоходного налога или чего-то в этом роде.Чтобы составить действительную форму подоходного налога, то есть заполненную с вашим именем, SSN и т. Д., Вам нужна копия «чистого» оригинала.Таким образом, вы не можете «спрятать» форму от человека и ожидать, что он заполнит ее правильно.То же самое верно для компилятора.Когда вы создаете экземпляр функции или класса шаблона, необходимо сделать копию шаблона доступной для компилятора, чтобы заполнить параметры шаблона и фактически сгенерировать для вас «настоящий» код, который затем компилируется в кодмодуль.

...