Как создать коммерческую библиотеку с использованием шаблонов в C ++? - PullRequest
2 голосов
/ 15 марта 2012

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

Теперь, есть ли способ сделать это?

Примечание: я знаю о ключевом слове "экспорт" иПрочитайте это страница !

Ответы [ 4 ]

3 голосов
/ 15 марта 2012

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

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

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

2 голосов
/ 15 марта 2012

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

Если этого недостаточно для ваших нужд, вот несколько вещей, которые вы можете сделать:

  • Разложить код на компоненты с минимальной зависимостью от аргументов шаблона.Это может привести к появлению частей кода, которые вы можете поместить в легко скомпилированный объект, потому что они не зависят от аргументов шаблона, или вы можете предварительно создать код.
  • Запутывание кода может быть одним из способов.В этом контексте стоит отметить, что причиной отсутствия «Состязания С ++» в Obfuscated Ctest было: «Это было бы похоже на отстрел рыбы в бочке».
  • Создайте сервис, в который клиенты будут загружатьобъявления класса, необходимые для создания экземпляра шаблона и возврата обратно скомпилированного экземпляра.Конечно, если вы не доверяете клиентам, у них нет оснований предполагать, что вы заслуживаете доверия.
  • Дождитесь следующего пересмотра стандарта, который, как мы надеемся, имеет какой-то модуль Поддержка, помогая с этим вопросом.Однако я бы не стал слишком сильно ставить на это.

Лично я бы не стал беспокоиться: по отзывам, полученным от моего кода, кажется, что, несмотря на документацию и объяснения, никто не готов его трогать,Я думаю, что это довольно читабельно ..,

1 голос
/ 15 марта 2012

templatelib.h

template<typename T> void foo();

templatelib.cpp

#include <iostream>
#include "templatelib.h"

template<typename T> void foo() {
    std::cout << typeid(T).name() << '\n';
}

template void foo<int>(); // explicitly instantiate template for this type

main.cpp

#include "templatelib.h"

int main() {
    foo<int>(); // Okay
    foo<double>(); // error
}
1 голос
/ 15 марта 2012

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

Однако, если естьТаким образом, вы можете ограничить количество используемых фактических специализаций, вы можете переместить специализированные реализации в файл cpp, сохранить объявление в заголовке, и оно все равно будет работать:

header.h

template<typename X>
void foo(X x);

template<>
void foo<int>(int x);

impl1.cpp

#include "header.h"

template<>
void foo<int>(int x)
{
}

impl2.cpp

#include "header.h"

foo(1); //works

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

...