LINUX.ORG.RU

Как правильно сгенерировать символы для экземпляров шаблонных функций?

 , ,


0

1

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

★★★★★
Ответ на: комментарий от rumgot

Ну, например такая функция:

template<int nd, int pushm, int ord>
void ppush_fn (grid_t<nd>, ppool_t<nd>, lattice_data_t<float, nd>, float);
где nd=[1..3], pushm=[0..2], ord][1..3], получается 9* функций, причём из них только 3 с разной сигнатурой (*возможно, там ещё какие-то флаги будут.) Соответственно, для них я могу завести указатель типа
template<int nd>
using push_fn_t\
= void(*)(grid_t<nd>, ppool_t<nd>, lattice_data_t<float, nd>, float);
Но вот что с этим делать дальше? Была идея положить эти типы в юнион и сделать обычный, нешаблонный враппер, возвращающий сабж, всех типов и вариаций в зависимости от запроса. Но положить их в юнион не получается...

thunar ★★★★★
() автор топика

А что думаете об использовании extern template? Ну, т.е. разделить хидеры на две категории «для внешнего мира» и «внутренние, для библиотеки». В хидерах для внешнего мира везде указать extern template.

//P.S. Сам я такого не делал и глубоко в проблему не погружался, так что где-то могу ошибаться.

pathfinder ★★★★
()

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

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

raspopov
()

Ничего не понятно что тебе нужно. Какой-то указатель, какой-то юнион. Про extern template тебе уже сказали. Если у тебя вообще весь код такой, можешь юзать -fno-implicit-templates для гарантии.

У тебя вопрос как написать все эти объявления, потому как руками это делать лень? Бери те же макросы, либо ещё что-то подобное. Готовое для такого вряд ли найдёшь.

jsforever
()

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

faq2
()
Ответ на: комментарий от raspopov

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

Главный смысл шаблонов - написание обощенного кода, не зависящего от конкретных типов.

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

а так же не забываем про базовый принцип ООП - наследование

К чему это здесь? В коде ТСа шаблонные функции, а не методы, и нет ни одного намека на ООП.

annulen ★★★★★
()
Ответ на: комментарий от faq2

В случае под онтопик - вообще ничего дополнительно не нужно прописывать, т.к. там вообще всё подряд экспортируется.

К счастью, умные люди придумали -fvisibility=hidden, чтобы не экспортировать тысячи ненужных символов

annulen ★★★★★
()