| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > специализация шаблона для списка типов |
| Автор: Alek86 18.2.2008, 18:28 | ||||
есть шаблон (ну, к примеру, функции)
и нужно сделать 2 специализации (для int и для char)
но тут оказалось, что специализации абсолютно идентичны (потому обе и называются realization 2). Есть ли какой хитрый механизм, который позволяет в этом случае избавиться от копипаста? |
| Автор: Earnest 18.2.2008, 18:44 |
| Реализуй в не-темплэйтной функции и вызови ее из обеих реализаций. |
| Автор: Alek86 18.2.2008, 18:51 | ||
наверное, условие не то. ща сподправим-с:
как в таком случае поступить? (желательно пообщей рецепт, а не только для этого случая подходящий) |
| Автор: Earnest 18.2.2008, 18:58 | ||
| В данном случае проще копировать - было бы о чем говорить. Если код заметно длиннее, то так:
|
| Автор: Alek86 18.2.2008, 19:01 |
| да, наверное надо было сразу общный вопрос а в случае с шаблонными классами? |
| Автор: maxim1000 18.2.2008, 19:30 |
| ну если усилия себя окупят, то можно попробовать повозиться со списками типов, описанными у Александреску тогда можно будет написать шаблончик, который возьмёт на вход список типов и тип, для которого строится специализация функции, потом определит, входит ли этот тип в список, и, в зависимости от результата, вызовет одну из двух функций P.S. конечно же, можно обобщить на несколько списков типов с соответствующими реализациями + одну для всех остальных типов |
| Автор: Alek86 18.2.2008, 19:55 |
| я примерно то и думал... думал, есть готовое есть же шаблоны, что говорят, является ли тип наследником другого. с этим можно многое совершить, имхо ) |
| Автор: Alek86 19.2.2008, 11:53 |
| нельзя если куча нужных конструкторов в A и B |
| Автор: _stranger_ 19.2.2008, 12:23 | ||
кстати есть мнение что специализировать шаблон функции не есть гуд... вместо этого необходимо использовать перегрузку шаблона функции... аргументируется это тем что специализации шаблона функции никогда не учавствуют в перегрузке... |
| Автор: Alek86 19.2.2008, 12:47 |
| спасибо за информацию - но вопрос не о том |
| Автор: maxim1000 19.2.2008, 15:47 |
в смысле? классы пустые, оптимизатор наверняка выкинет вообще всё, что можно |
| Автор: Alek86 19.2.2008, 16:14 |
| а, тьфу не так код прочел... это еще один вариант перегрузки функций? если да, то что насчет перегрузки классов? тут наследование не пройдет |
| Автор: maxim1000 19.2.2008, 17:49 | ||||
ну можно и так сказать
в смысле выбор класса в зависимости от наличия/отсутствия в списке? можно вместо объявления func делать typedef:
|
| Автор: Alek86 19.2.2008, 18:00 |
| блин, хреновасто я вопрос этот задал... думал, что можно перегружать для классов классов (гы-гы), подходящих под какое-то опреленное условие примеры условий - тип класса находится в определенном списке типов, класс является наследником другого, у класса есть вирт деструктор (то есть от него можно безбоязненно наследоваться) и т.п. то есть примерно то, что ты, maxim1000, в послежднем посте написал, только более автоматизированно ЗЫ. справедливости ради нужно сказать, что и до того я чето не допетрил :( |
| Автор: Alek86 20.2.2008, 10:51 | ||||||||||
не без помощи одолел проблему:
на MVS 2005 пашет и правильно осталась пара вопросов 1. это по стандарту такое поведение, что если в
возвращает InMultitude1, то даже несмотря на то, что компилятор уже начал, фактически, подставлять главный шаблон, он все равно еще раз пробегает по всем специализациям и находит
? 2. как-то можно избавиться в этом случае от статик каста в
? |
| Автор: _stranger_ 20.2.2008, 11:32 | ||||
Мне кажется проблемма не до конца решена, вот например посмотри подставляем long и double
я вот так пытался решить эту проблему с помощью списков типов, но тоже проблема до конца не решена:
|
| Автор: Alek86 20.2.2008, 11:40 | ||||
у меня выводится все, как я ожидал для sizeof(T) == 1 выводится 10 для sizeof(T) == 2 выводится 20 для остальных случаев выводится 0 sizeof тут чисто для проверки работы. вместо
|