Разделение интерфейса шаблона и реализация в С++

Это следующий вопрос: Использование ключевого слова export с шаблонами

Как упоминалось в ответах на исходные вопросы, "экспорт" устарел в С++ 0x и редко поддерживается компиляторами даже для С++ 03. Учитывая эту ситуацию, каким образом можно скрыть фактические реализации в файлах lib и просто выставить объявления через заголовочные файлы, чтобы конечный пользователь мог знать, что является сигнатурами открытого API, но не имеет доступа к исходному коду, реализующему то же самое?

Ответ 1

На практике вы не можете.

Только если у вас есть определенный набор специализаций, вы можете поместить их в библиотеку. Базовый шаблон не может быть размещен там.

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

Ответ 2

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

Ответ 3

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

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

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

Обратите внимание, что то, что вы просите, несколько противоположно.

Сама цель шаблона - создать "шаблон", чтобы компилятор мог генерировать классы и функции для множества несвязанных типов. Если вы спрячете этот шаблон, как вы ожидаете, что компилятор сможет генерировать эти классы и функции?

Ответ 4

Вы можете использовать шаблон extern в самых последних компиляторах: http://en.wikipedia.org/wiki/C%2B%2B0x#Extern_template

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

Затем, когда вам нужен шаблон, сначала используйте шаблон extern, чтобы убедиться, что он еще не создан. Затем для каждого требуемого экземпляра (один для std::vector, один для std::vector и т.д.), Введите экземпляр в typedef, который будет в уникальной cpp.

Как это делает код явно сложнее понять, это еще не лучшее решение. Но он работает: он помогает минимизировать экземпляры шаблонов.