Разделение интерфейса шаблона и реализация в С++
Это следующий вопрос:
Использование ключевого слова 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.
Как это делает код явно сложнее понять, это еще не лучшее решение. Но он работает: он помогает минимизировать экземпляры шаблонов.