Разделение шаблона интерфейса и реализации в C ++ - PullRequest
10 голосов
/ 24 марта 2011

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

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

Ответы [ 4 ]

7 голосов
/ 24 марта 2011

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

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

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

2 голосов
/ 24 марта 2011

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

1 голос
/ 24 марта 2011

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

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

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

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

1 голос
/ 24 марта 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...