LINUX.ORG.RU

Функция-шаблон С++ в статической библиотеке?

 ,


0

3

Пишу под Debian, набросал библиотечку с набором функций. По ходу дела понадобилось в некоторых функциях работать с различными типами данных, описал как шаблоны. Теперь undefined reference при сборке проекта, который эту библиотеку подключает и вызывает функции-шаблоны. Можно ли это обойти? Или шаблоны только в рамках одного проекта могут быть используемы?


Шаблоны не в заголовках что ли? Должны быть в них, чтобы с любыми типами работали.

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

Я лошара)) Исходные-то в .cpp-файлах были... xaizek, спасибо.

Putnik
() автор топика

Если список типов известен, можно и в cpp оставить и там же явно инстанцировать шаблон для нужных типов.

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

Что не так?

Делать больше нечего, чем явно инстанцировать шаблоны. Либы в цепепе нынче модно делать «header only». (На самом деле, давно модно, со времён STL.) Нет, ну если очень хочется, всегда пожалуйста. Но тогда, опять же, лол.

azelipupenko
()

Шаблоны C++ (и Rust) — это макросы, для использования они должны быть доступны в виде исходного кода (ну, почти).

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

Шаблоны C++ (и Rust) — это макросы

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

azelipupenko
()
Ответ на: комментарий от i-rinat

Шаблоны это макросы с гигиеной.

Гору книг по цепепе видал, но нигде такого определения не встретил. Сдаётся мне, что это твоя личная фантазия.

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

Шаблоны C++ (и Rust) — это макросы

Лол. Если бы шаблоны в цепепе были бы макросами, то они назывались бы макросами. (Как в том же Rust.) А шаблоны в цепепе - это средство для обеспечения полиморфизма времени компиляции.

В Расте ~ аналог шаблонов это дженерики. И макросы там есть, аж 2 вида, но это отдельная вещь.

Virtuos86 ★★★★★
()
Ответ на: комментарий от i-rinat

На здоровье.

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

Макрос - это функция, которая генерирует код.

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

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

А теперь определение даю я.

Шаблоны — макросы с гигиеной.

Классно да? Текст против текста. И никаких авторитетных источников.

Потому что их не существует.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

А теперь определение даю я.

А ты кто такой?

Шаблоны — макросы с гигиеной.

Держи нас в курсе. Напиши статью в Computer Science и поведай миру о своих фантазиях. А вдруг кто прислушается.

Классно да? Текст против текста. И никаких авторитетных источников.

Почитай Страуструпа, почитай Грэма, почитай Википедию на худой конец. И обломайся. Потому что я прав, а ты - нет.

Потому что их не существует.

Ты опять обломался. Они существуют. Вот тебе Страуструп, TC++PL, глава 23.1:

«Templates provide direct support for generic programming (§3.4) in the form of programming using types as parameters. The C++ template mechanism allows a type or a value to be a parameter in the definition of a class, a function, or a type alias.»

Вот тебе Грэм, «On Lisp»:

«The definition of a macro is essentially a function that generates Lisp code—a program that writes programs.»

А вот i-rinat ***** заявляет, что шаблоны - это макросы. Ну да пусть, у него свой мир, ему там хорошо. Лол.

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

А ты кто такой?

А ты?

Ты опять обломался. Они существуют. Вот тебе Страуструп, TC++PL, глава 23.1:

«Templates provide direct support for generic programming (§3.4) in the form of programming using types as parameters. The C++ template mechanism allows a type or a value to be a parameter in the definition of a class, a function, or a type alias.»

Это не определения, это описания, что они могут делать.

Вот тебе Грэм, «On Lisp»:

«The definition of a macro is essentially a function that generates Lisp code—a program that writes programs.»

Ха-ха-ха. Это не определение понятия «макрос», это про определение конкретного экземпляра макроса. :-D

Слово definition в заблуждение ввело? Поищи на досуге общепризнанные определения этих понятий, что ли.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

А теперь определение даю я.

Шаблоны — макросы с гигиеной.

Как я могу посмотреть Си++-код, генерируемый шаблоном?

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

Как я могу посмотреть Си++-код, генерируемый шаблоном?

https://cppinsights.io/

Т.е. стандартного способа увидеть текст нет. И этот инструмент тоже его не показывает: https://cppinsights.io/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvc... Потому что не генерируется никакого текста.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

Надо вручную специализировать инстанцировать все реализации шаблонов, для всех типов, которые планируется поддержать. В частности, можно поддержать дополнительные типы, путём введения интерфейсного класса, с требованием от пользователя реализовать такой интерфейс, хотя, это «слегка» снижает ценность использования шаблонов и если есть возможность, я бы предпочёл заплатить в рантайме и использовать что-то в духе std::variant.

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от tailgunner

То есть, некий компилятор, не использующий промежуточный шаг для разворачивания макросов в текст, сломает твой мозг?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

А ты?

Я - знаменитый аноним :-) Лол :-)

Это не определения, это описания, что они могут делать.

Это определение от автора Си++, которое он дал в своей главной книге о Си++. Чётко сказано - «The C++ template mechanism allows a type or a value to be a parameter in the definition of a class, a function, or a type alias.» Почему тут не хватает тире между «template» и «mechanism» - это вопрос к ув. Бьярну. А так, это - самое настоящее определение шаблонов в крестах.

Ха-ха-ха. Это не определение понятия «макрос», это про определение конкретного экземпляра макроса. :-D

Ты несёшь какую-то ахинею. Какой ещё экземпляр макроса? Что такое экземпляр макроса? У макроса, по определению, может быть только результат. Этот результат - есть код на целевом языке. Лол.

Слово definition в заблуждение ввело? Поищи на досуге общепризнанные определения этих понятий, что ли.

Меня в данном примитивном вопросе уже давно ничего не вводит в заблуждение. Ни в убогих шаблонах в крестах, ни в убогих марках си/крестов, ни в реальных макрах Лиспа.

azelipupenko
()
Ответ на: комментарий от i-rinat

То есть, некий компилятор, не использующий промежуточный шаг для разворачивания макросов в текст, сломает твой мозг?

То есть покажи мне Си++-текст, в который разворачивается шаблон. Указанный тобой инструмент ничего такого не делает: https://cppinsights.io/lnk?code=I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvc...

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

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

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

директив предкомпилятора

Что такое «предкомпилятор»? Если речь о препроцессоре, то результатом его работы является текст (как и записано в стандарте).

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

Чётко сказано - «The C++ template mechanism allows

У тебя какое-то мутное понимание чёткости. Сравни:

Function is a relation from a set of inputs to a set of possible outputs where each input is related to exactly one output.

и

Function allows us to generate a forecast.

Ещё раз: процитированная фраза не является определением. Там просто говорится, что можно делать шаблонами.

Ты несёшь какую-то ахинею. Какой ещё экземпляр макроса? Что такое экземпляр макроса? У макроса, по определению, может быть только результат. Этот результат - есть код на целевом языке. Лол.

Прочитай текст процитированный тобой текст ещё раз. Потом прочитай текст вокруг. Попытайся понять, что значит этот текст.

Меня в данном примитивном вопросе уже давно ничего не вводит в заблуждение.

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

У тебя какое-то мутное понимание чёткости. Сравни:

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

Там просто говорится, что можно делать шаблонами.

Раз у тебя так плохо с английским определением шаблонов от их же создателя, давай я тебе процитирую Википедию, раз ты сам не можешь: «Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).» Как из этого определения следует, что, оказывается, шаблоны в цепепе - это «макросы с гигиеной» мне не ведомо.

Другими словами, вещаемое тобой имеет больше относится к религии, чем к научному познанию мира

Другими словами, у меня совершенно ясное понимание шаблонов цепепе. И что это никакие не «макросы с гигиеной». Никому, кроме тебя, такая нелепость в голову не приходила. Ни Вандервуду, ни Джосатиссу, ни Александреску, ни даже самому Страуструпу. Лол.

azelipupenko
()
Ответ на: комментарий от i-rinat

И... ты ушёл от вопроса. Отлично.

Отлично. Покажи ка «макросы с гигиеной» в действии. Покажи, как на шаблонах реализовать, например, замену макросу assert(). Покажи силу «макросов с гигиеной» цепепе в действии.

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

Покажи ка «макросы с гигиеной» в действии. Покажи, как на шаблонах реализовать, например, замену макросу assert().

Есть то, что я написал, и есть то, что ты думаешь, что я написал.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Есть то, что я написал, и есть то, что ты думаешь, что я написал.

Ты написал, что шаблоны в цепепе - это «макросы с гигиеной». Если на «макросах с гигиеной» нельзя реализовать банальный assert(), то это уже не макросы. Ч.т.д.

azelipupenko
()
Ответ на: комментарий от tailgunner

Да, и с тех пор чувствую себя гораздо лучше. Всем рекомендую.

А зачем ты квасил утром то?

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

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

Я предлагаю тебе прочитать то, что ты цитируешь.

Раз у тебя так плохо с английским определением шаблонов от их же создателя

Это не определение. Если тебе с английским тяжело, я могу на русском пример написать. «Скорость это путь, который объект проходит за единицу времени» — определение. «Скорость позволяет нам сравнивать машины между собой по ещё одному признаку» — нет. Чувствуешь разницу?

у меня совершенно ясное понимание шаблонов цепепе

Обычно у тех, кто так заявляет, такая каша в голове... Но у тебя всё по-другому. Я правильно понимаю?

Спорит о шаблонах и макросах, но при этом путает препроцессор («цепепе») с C++.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Указанный тобой инструмент ничего такого не делает

Ты, кстати, чего вообще ожидал? T t он развернул, автогенерируемые конструкторы указал. Чего ещё надо-то?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Я предлагаю тебе прочитать то, что ты цитируешь.

Тебе это всё равно никак не поможет.

Это не определение. Если тебе с английским тяжело, я могу на русском пример написать. «Скорость это путь, который объект проходит за единицу времени» — определение. «Скорость позволяет нам сравнивать машины между собой по ещё одному признаку» — нет. Чувствуешь разницу?

Ты, случайно, не выпускник системы егэ? Если да, то это многое объясняет. Лол. Давай я тебе разъясню. Смотри вот в цитату: «The C++ template mechanism allows a type or a value to be a parameter in the definition of a class, a function, or a type alias.». Теперь смотри по-другому: «The C++ template is a mechanism that allows a type or a value to be a parameter in the definition of a class, a function, or a type alias.» Теперь это определение, можешь быть спокойным. Галочка поставлена в нужную клеточку, переходи к следующему тесту. Лол.

Обычно у тех, кто так заявляет, такая каша в голове... Но у тебя всё по-другому. Я правильно понимаю?

Сдаётся мне, что ты ничего не понимаешь совсем. Иди учись. В школу.

Спорит о шаблонах и макросах, но при этом путает препроцессор («цепепе») с C++.

Ага, стоило тебя попросили нарисовать реализовать аналог стандартного assert() на шаблонах, которые ты называешь «макросами с гигиеной», как ты тут же слился. Лол.

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

реализовать аналог стандартного assert() на шаблонах

я тут мимокрокодил, но чем static_assert не устраивает?

anonymous
()
Ответ на: комментарий от azelipupenko

да ниче, напористый бурят попался

anonymous
()
Ответ на: комментарий от azelipupenko

Нет там никакого полиморфизма. А есть банальная генерация кода, которую попытались приспособить для имитации полиморфизма. Получилось на троечку.

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

Вот-вот. И то, что там называется «дженерики» — это те же макросы. Настоящих дженериков там нет и, похоже, не будет.

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

Нет там никакого полиморфизма. А есть банальная генерация кода, которую попытались приспособить для имитации полиморфизма.

Ага, а ещё Солнце банально вращается вокруг Луны.

azelipupenko
()
Ответ на: комментарий от Miguel

Шаблоны в C++ всегда были средством генерации кода.

Ограниченным и убогим. Пока кто-нибудь не покажет как на шаблонах сделать аналог assert() или range-for, до тех пор это будет верным утверждением.

azelipupenko
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.