8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
||||||||||||||||
1 | ||||||||||||||||
Шаблонные функции только для определённых типов!20.01.2013, 12:20. Показов 5292. Ответов 18
Метки нет (Все метки)
Как сделать чтобы для шаблонной функции генерировались только экземпляры для нескольких заданных типов, а остальные не генерировались?
Следующее определение не помогает (в конце кода):
0
|
20.01.2013, 12:20 | |
Ответы с готовыми решениями:
18
Можно ли сделать шаблон функции только для определенных типов? Template для определенных типов Шаблонные функции для обработки матриц Шаблонные функции для заполнения массива |
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
20.01.2013, 12:31 | 2 |
"k" - это строковый литерал, его символы костантны, поэтому и выводится const char, а не char. Почему бы просто не объявить in_add как str_type const*?
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
20.01.2013, 12:34 | 3 |
можно внутри попробовать заюзать удалятор константы.
что-нибубдь типа typedef typename boost::remove_const<str_type>::type non_const_str_type; и там, где надо менять переменную использовать non_const_str_type вместо str_type в новом стандарте такая штука возможно уже в std
0
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
|
20.01.2013, 12:51 [ТС] | 4 |
как не смешно, но есть решение проще, только что нашёл, такое смешное я просто в шоке, нужно для этого его объявить const str_type тогда в str_type подставляется только char из-за того, скорее всего, что если бы поставлялось const char, то было бы const const char - что есть ошибка!
Добавлено через 4 минуты Ну а вообще тема остаётся открытой, как для template функции генерировать только определённые инстанации?? И запрещать генерировать остальные?
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
20.01.2013, 13:44 | 5 | |||||
Объявить эту функцию, но не определять. Определить только конкретные специализации (не забываем, что для шаблонных функций запрещена частичная специализация, вместо неё используют перегрузки).
Пример:
В C++11 есть такая вещь, как extern template, подавляющая неявную инстанциацию в надежде, что где-то есть явная.
0
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
|
20.01.2013, 13:50 [ТС] | 6 |
Всё это конечно хорошо, но опять же теряется смысл в объявлении как template, ведь это по сути ничем не отличается от объявления двух перегруженных не template функций и если что-то нужно будет изменить придется менять в обоих, смысл тогда заморачиваться с template'ми?
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
20.01.2013, 14:06 | 8 | |||||
Ну почему же, никто не мешает использовать явную инстанциацию:
0
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
||||||
20.01.2013, 14:17 [ТС] | 9 | |||||
ну насколько я знаю указатель не может быть 2 или 100 он просто указывает на первый элемент массива, ток что всё же const char
ну объявить например некоторое значении внутри template функции с типом str_type а потом изменить его:
Добавлено через 10 минут в моём примере с const char и char это не работало вместо использования готовой специализации для char генерировалась для const char может быть с экстернами это по другому работает не знаю даже. это что же теперь template implementation можно совать в .cpp файл по новым стандартам??
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
20.01.2013, 14:25 | 10 |
Налицо явное непонимание. Цель была не дать пользователю создавать инстанциации самому. Для этого функцию объявляем, но не определяем. Все разрешённые инстанциации создаются в отдельном .cpp. Для этого в нём определяем шаблон нашей функции и создаём явные инстанциации для int и double. Это полноценные самостоятельные функции несмотря на то, что созданы из шаблона, поэтому они линкуются с вызовами, сделанными из других .cpp, где доступно только объявление.
0
|
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
20.01.2013, 14:32 | 11 |
Такая тема уже не раз поднималась. в новом стандарте так и не ввели средства для этого. Поэтому можно изгаляться по-разному. Например, сделать статик ассерт на все типы, кроме определенных.
0
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
|
20.01.2013, 14:34 [ТС] | 12 |
Цель была не совсем такая, нужно объявить template функцию (один раз!), а потом как-то описать под какие типы её можно генерить, а под остальные чтобы она сама не генерировалсь, вот!
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|||||||||||
20.01.2013, 14:41 | 13 | ||||||||||
Это то же самое абсолютно. Способ решения я и привёл: описываем функцию и инстанциируем её для всех нужных типов в отдельной единице трансляции. Эти инстанциации доступны для линкера, а создать новые инстанциации в других модулях невозможно, потому что определение шаблона функции этим модулять не доступно, у них есть только объявление. Заметим: во втором примере функция описана один раз, а инстанциируется два раза, для двух разрешённых типов.
Добавлено через 2 минуты Видимо, источник взаимного непонимания - как раз явная инстанциация. Конструкция
0
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
||||||
20.01.2013, 15:13 [ТС] | 14 | |||||
У меня на это матерится:
0
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
20.01.2013, 15:43 | 15 |
Так то ж из C++11. Попробуй без слова extern.
0
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
|
20.01.2013, 16:02 [ТС] | 16 |
да, теперь всё компилируется, но наверно я всё же чего-то не понимаю, а самое главное не понимаю чего именно я не понимаю! Я просто думал что определения темплейт функций должны быть всегда в хедерах и никогда в .cpp файлах, иначе что-то будет, а что будет? Подскажите ,пожалуйста, что мне прочитать чтобы "получить просветление" так сказать???
Добавлено через 1 минуту только не советуйте "курить стандарт", как мне где-то тут или не тут советовали, чего-то не очень длинное желательно
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
20.01.2013, 16:05 | 17 |
вот на мой взгляд одна из лучших книг по шаблонам в плюсах:
http://www.ozon.ru/context/detail/id/3960662/ хоть и до новостандартная, все равно очень хорошая. в ней есть в частности глава 10 про инстанцирование.
1
|
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
20.01.2013, 16:46 | 18 |
Это не религиозная догма. Содержимое шаблонов быть в заголовках, чтобы их можно было инстанциировать: для этого ведь необходимо знать содержимое шаблона. Ведь что такое инстанциация? Берём шаблон void printf<T>(T) (который сам по себе не функция, а только заготовка для создания функций), подставляем туда конкретные типы (ну или константы) и на выходе получаем конкретный тип или конкретную функцию: void print<int>(int). А потом - другую функцию, формально совершенно независимую от первой: void print<double>(double).
То есть, мы выносим определение шаблона в отдельный файл и там же инстанциируем всё, что нам нужно. В результате этот файл по сути содержит набор уже окончательных функций. Обращение к таким функциям происходит как и к любым другим, через механизм связывания (через линкер). Для обращения к функции надо лишь знать типы аргументов и возвращаемого значения: объявление этой функции. Так что при определении шаблонов внутри .cpp это "иначе что-то будет" сводится к невозможности инстанциировать шаблоны вне тех .cpp, в которых они объявлены. Что обычно противоречит нашим намерениям, но в данном случае - именно то, что доктор прописал.
1
|
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
|
|
20.01.2013, 16:51 [ТС] | 19 |
0
|
20.01.2013, 16:51 | |
20.01.2013, 16:51 | |
Помогаю со студенческими работами здесь
19
Шаблонные классы. Присвоение к указателю и приведение типов Преобразование типов для копирования определенных ячеек из одного столбца в массив Шаблонные функции для нахождения минимального и максимального элемента пары чисел Написать шаблонные, перегруженные функции для ввода и вывода на экран массивов и матриц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |