Страница 1 из 2

Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:16
Сионист
Есть шаблонная функция, тело функции записано в одном cpp-файле, а вызывается она из других cpp-файлов. Сейчас в качестве временного костыля за телом шаблонной функции в том же файле следует другая функция, в теле которой вызываются все версии шаблонной функции, кроме явно специализированных. Единственное назначение этой костыльной функции - создать версии шаблонной функции, если её убрать, то среда начинает ругаться, на то, что линкер не знает версий шаблонной функции. Если тело шаблонной функции в нести в заголовочный файл и инкладить во все вызывающие файлы, то при наличии даже одной явной специализации начинается ругань на multiple dfinition. Или на сам шаблон, если все явные специализации в отдельном cpp-файле, или на явные специализации, если они находятся в заголовочном. Как избавиться от костыльной функции и всё таки создать версии шаблонной функции, но не специализировать их все?

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:21
Absurd
Обычно шаблоны пишут в .h файлах. Дублирующиеся инстанциации потом вычищает линковщик.

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:28
Romeo
Для явного инстанцирования используется вот такой синтаксис:

Код: Выделить всё


template<typename T>
void Function()
{
}

template void Function<int>();
template void Function<double>();
И, кстати, это легко находится в первой же ссылке в гугле, если его спросить о явном инстанцировании...

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:31
Сионист
Absurd писал(а):Обычно шаблоны пишут в .h файлах. Дублирующиеся инстанциации потом вычищает линковщик.
Так я так и хотел. Проблема в том, что при наличии явных специализаций не вычищает.

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:31
Romeo
Absurd писал(а):Обычно шаблоны пишут в .h файлах. Дублирующиеся инстанциации потом вычищает линковщик.
Явное инстанцирование используется для случаев, когда нужно заэкпортить из библиотеки (или из единицы трансляции) инстансы функции только для данного списка типов. В таком случае в хедере размещают лишь объявление шаблона, а в каком-нибудь cpp размещают определение шаблона и потом делают явное инстансирование.

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:32
Сионист
Romeo писал(а):И, кстати, это легко находится в первой же ссылке в гугле, если его спросить о явном инстанцировании...
Первой же ссылке сотой страницы или двухсотой?

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:35
Сионист
Romeo писал(а):Явное инстанцирование используется для случаев, когда нужно заэкпортить из библиотеки (или из единицы трансляции) инстансы функции только для данного списка типов.
Тот самый случай. Только не из библиотеки.
Romeo писал(а):В таком случае в хедере размещают лишь объявление шаблона, а в каком-нибудь cpp размещают определение шаблона и потом делают явное инстансирование.
И получаем мультипальную дефиницию. Спасибо.

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:37
Absurd
Проблема в том, что при наличии явных специализаций не вычищает.
Что такое "явная специализация"? Ты точно не путаешь ее с частичной (partial) специализацией? Просто в том коде который у тебя не работал в соседней ветке ты попытался (криво) сделать именно частичную специализацию шаблона для типа int.

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:38
Romeo
Сионист писал(а):Так я так и хотел. Проблема в том, что при наличии явных специализаций не вычищает.
У тебя тело, просто, не в хедере, а в cpp файле. Absurd верно говорит о том, что можно перенести тело в хедер - это тоже решит проблему. Но решение с явным инстансированием более строгое, если эта строгость, конечно, тебе нужна. Вообще, мне кажется, что такая строгость тебе не нужна, и ты просто не понимаешь толком, как работают шаблоны, раз такой вопрос возник :)

Re: Как лучше создать версию шаблонной функции?

Добавлено: 26 ноя 2015, 15:39
Romeo
Absurd писал(а):Что такое "явная специализация"? Ты точно не путаешь ее с частичной (partial) специализацией? Просто в том коде который у тебя не работал в соседней ветке ты попытался (криво) сделать именно частичную специализацию шаблона для типа int.
Он путает её с явным инстанцированием сейчас ;)