![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Alek86 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
есть шаблон (ну, к примеру, функции)
и нужно сделать 2 специализации (для int и для char)
но тут оказалось, что специализации абсолютно идентичны (потому обе и называются realization 2). Есть ли какой хитрый механизм, который позволяет в этом случае избавиться от копипаста? |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Реализуй в не-темплэйтной функции и вызови ее из обеих реализаций.
-------------------- ... |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
наверное, условие не то. ща сподправим-с:
как в таком случае поступить? (желательно пообщей рецепт, а не только для этого случая подходящий) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В данном случае проще копировать - было бы о чем говорить.
Если код заметно длиннее, то так:
-------------------- ... |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
да, наверное надо было сразу общный вопрос
а в случае с шаблонными классами? |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну если усилия себя окупят, то можно попробовать повозиться со списками типов, описанными у Александреску
тогда можно будет написать шаблончик, который возьмёт на вход список типов и тип, для которого строится специализация функции, потом определит, входит ли этот тип в список, и, в зависимости от результата, вызовет одну из двух функций P.S. конечно же, можно обобщить на несколько списков типов с соответствующими реализациями + одну для всех остальных типов -------------------- qqq |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
я примерно то и думал... думал, есть готовое
есть же шаблоны, что говорят, является ли тип наследником другого. с этим можно многое совершить, имхо ) |
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
кстати, с наследованием тоже можно поиграться:
![]() Это сообщение отредактировал(а) maxim1000 - 18.2.2008, 22:18 -------------------- qqq |
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
нельзя
если куча нужных конструкторов в A и B |
|||
|
||||
_stranger_ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 3.10.2006 Где: город-герой Киев Репутация: 2 Всего: 2 |
кстати есть мнение что специализировать шаблон функции не есть гуд... вместо этого необходимо использовать перегрузку шаблона функции... аргументируется это тем что специализации шаблона функции никогда не учавствуют в перегрузке... |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
спасибо за информацию - но вопрос не о том
![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
в смысле? классы пустые, оптимизатор наверняка выкинет вообще всё, что можно -------------------- qqq |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
а, тьфу не так код прочел...
это еще один вариант перегрузки функций? если да, то что насчет перегрузки классов? тут наследование не пройдет |
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну можно и так сказать
в смысле выбор класса в зависимости от наличия/отсутствия в списке? можно вместо объявления func делать typedef:
-------------------- qqq |
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
блин, хреновасто я вопрос этот задал...
думал, что можно перегружать для классов классов (гы-гы), подходящих под какое-то опреленное условие примеры условий - тип класса находится в определенном списке типов, класс является наследником другого, у класса есть вирт деструктор (то есть от него можно безбоязненно наследоваться) и т.п. то есть примерно то, что ты, maxim1000, в послежднем посте написал, только более автоматизированно ЗЫ. справедливости ради нужно сказать, что и до того я чето не допетрил :( |
|||
|
||||
Alek86 |
|
||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
не без помощи одолел проблему:
на MVS 2005 пашет и правильно осталась пара вопросов 1. это по стандарту такое поведение, что если в
возвращает InMultitude1, то даже несмотря на то, что компилятор уже начал, фактически, подставлять главный шаблон, он все равно еще раз пробегает по всем специализациям и находит
? 2. как-то можно избавиться в этом случае от статик каста в
? |
||||||||||
|
|||||||||||
_stranger_ |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 3.10.2006 Где: город-герой Киев Репутация: 2 Всего: 2 |
Мне кажется проблемма не до конца решена, вот например посмотри подставляем long и double
я вот так пытался решить эту проблему с помощью списков типов, но тоже проблема до конца не решена:
Это сообщение отредактировал(а) _stranger_ - 20.2.2008, 11:36 |
||||
|
|||||
Alek86 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
у меня выводится все, как я ожидал для sizeof(T) == 1 выводится 10 для sizeof(T) == 2 выводится 20 для остальных случаев выводится 0 sizeof тут чисто для проверки работы. вместо
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |