Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 10
1

Не тривиальное использование шаблонов

22.04.2012, 15:34. Показов 1503. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся со следующей проблемой:

предположим что у нас есть простой шаблонный класс
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2012, 15:34
Ответы с готовыми решениями:

Использование шаблонов
Здравствуйте, пытаюсь набросать элементарный пример шаблона в Visual Studio 12 и получаю ошибку...

использование шаблонов
не могу понять в чем дело.... для примера приведу простенькую функцию ввода элементов в вектор......

С++ использование шаблонов
Приветствую всех на форуме. Написал код с использованием шаблонов. Задание звучит так : ...

Использование функций шаблонов
Использование функций шаблонов: для работы с двумерными массивами арифметических типов данных...

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
Можно попробовать конструкцию union, или воспользоваться уже готовой, например VARIANT, _variant_t

Удачи,
Владимир
в VARIANT не определены логические и арифметические операции поэтому например так нельзя:

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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2012, 12:01
Помогаю со студенческими работами здесь

Использование шаблонов функций
После си только начал изучение с++, так вот программа просто выводит минимум из двух чисел,...

Использование функций шаблонов
Ребят помогите. надо для работы с двумерными массивами арифметических типов данных разработать...

Использование функций шаблонов
Помогите с задачей: Подсчитать среднее арифметическое ненулевых элементов, расположенных под...

Задача на использование шаблонов
Здравствуйте, ребята! Помогите, пожалуйста с задачкой на C++. Вот само задание: Для работы с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru