0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 10
|
|
1 | |
Не тривиальное использование шаблонов22.04.2012, 15:34. Показов 1503. Ответов 6
Метки нет (Все метки)
Столкнулся со следующей проблемой:
предположим что у нас есть простой шаблонный класс template <class Type> class Test { protected: Type m_val; } Нам необходимо создать контейнер vector, содержащий экземпляры класса Test, причем тип Type может быть разным. Как это сделать? vector<Test<int> > m_arr; - тогда можно запихнуть Test имеющий Type = int, а мне нужно чтобы еще и другие - например float, char* Так вот - как запихнуть в vector все возможные Test, а не с определенным шаблонным параметром, например, ???
0
|
22.04.2012, 15:34 | |
Ответы с готовыми решениями:
6
Использование шаблонов использование шаблонов С++ использование шаблонов Использование функций шаблонов |
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
|
22.04.2012, 23:48 | 2 |
хммм... пожалуй что только так: vector<void* > m_arr;
0
|
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 10
|
|
23.04.2012, 08:10 [ТС] | 3 |
но потом эту void* необходимо назад преобразовывать к исходному типу
а как это сделать?? мне подсказали несколько вариантов на http://www.sql.ru/forum/actualthread.aspx?tid=261862 но там тоже есть свои сложности - посмотри - может предложишь свой вариант получше?
0
|
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
|
24.04.2012, 02:37 | 4 |
Вектор - это шаблон, который принимает в качестве параметра тип или класс объектов, экземпляры которых он будет хранить. Если вы планируете хранить данные любого типа, включая примитывные типы (int, long, char, bool, etc.) то, на мой взгляд, единственный способ это реализовать - это создать вектор указателей на любой тип (void *).
В этом случае, правда, возникнут трудности определения типа хранимого объекта в режиме Run-Time при его извлечении из вектора. Поэтому в указанном вами форуме вам уже рекомендовали обернуть примитивные типы и объекты других классов, классом, который может "подсказать" тип текущего объекта (у которого есть метод приведения к примитивным типам или есть метод GetType() и пр.). Данная техника является классическим подходом для примитивных типов данных, который носит английское название: boxing/unboxing, и широко применяется в Java и .NET Другое дело, если вам не требуется хранить абсолютно любые типы, а лишь все объекты конкретной иерархии классов. Например, вы хотите создать вектор графических объектов для их отрисовки на экране. Объекты следующих классов: CCircle, CSquare, CTriangle, CLine, CDot, CRectangle, etc. Тут уже на помощь приходят основные механизмы ООП. Очевидно, что имеет смысл создать базовый класс, скажем CGraphObject, у которого определить виртуальную абстрактную функцию void Draw(). Все выше перечисленные классы должны наследовать класс CGraphObject и реализовать метод Draw() в соответствии со своей спецификой. Нетрудно догадаться, что в данном случае разумнее всего создать вектор, хранящий объекты типа CGraphObject: vector<CGraphObject> m_arr; Дальнейшее использование - пробегать по вектору и вызывать метод Draw(). Благодаря замечательной идее полиморфизма, программа в режиме Run-Time самостоятельно примет решение, какую конкретную реализацию функции Draw применять к тому или иному объекту. Удачи, Владимир P.S. не думаю, что рассказал что-то новое, но раз уж вы спросили, решил еще раз повторить основные идеи шаблонов и ООП.
0
|
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
|
24.04.2012, 02:59 | 5 |
Можно попробовать конструкцию union, или воспользоваться уже готовой, например VARIANT, _variant_t
Удачи, Владимир
0
|
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 10
|
|
25.04.2012, 07:46 [ТС] | 6 |
Сообщение от boombastik
VARIANT var1, var2; var1.intVal = 1; var2.fltVal = 1.1; if(var1 < var2) //запрещено, а мне надо чтобы можно было Я слышал что в COM есть структура типа VARIANT которая это позволяет кто нидь знает про нее???
0
|
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
|
25.04.2012, 12:01 | 7 |
Существует несколько классов-оберток для структуры VARIANT, самые распространенные - это _variant_t и CComVariant, судя по всему, второй класс как раз умеет выполнять операции сравнения:
http://msdn.microsoft.com/libr... embers.asp Удачи, Владимир
0
|
25.04.2012, 12:01 | |
25.04.2012, 12:01 | |
Помогаю со студенческими работами здесь
7
Использование шаблонов функций Использование функций шаблонов Использование функций шаблонов Задача на использование шаблонов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |