Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
dmitrdv
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 10
#1

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

22.04.2012, 15:34. Просмотров 1129. Ответов 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, а не с определенным шаблонным параметром, например, ???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2012, 15:34     Не тривиальное использование шаблонов
Посмотрите здесь:

использование шаблонов - C++
не могу понять в чем дело.... для примера приведу простенькую функцию ввода элементов в вектор... #include &lt;iostream&gt; ...

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

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

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

Использование функций-шаблонов - C++
На уроке преподаватель не объясняет как решать. Задачи берутся из &quot;Основы программирования на языке С++&quot; часть 2 Огнева М.В., Кудрина Е.В....

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.04.2012, 23:48     Не тривиальное использование шаблонов #2
хммм... пожалуй что только так: vector<void* > m_arr;
dmitrdv
0 / 0 / 0
Регистрация: 19.04.2012
Сообщений: 10
23.04.2012, 08:10  [ТС]     Не тривиальное использование шаблонов #3
но потом эту void* необходимо назад преобразовывать к исходному типу
а как это сделать??
мне подсказали несколько вариантов на http://www.sql.ru/forum/actualthread.aspx?tid=261862

но там тоже есть свои сложности - посмотри - может предложишь свой вариант получше?
boombastik
7 / 7 / 0
Регистрация: 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. не думаю, что рассказал что-то новое, но раз уж вы спросили, решил еще раз повторить основные идеи шаблонов и ООП.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
24.04.2012, 02:59     Не тривиальное использование шаблонов #5
Можно попробовать конструкцию union, или воспользоваться уже готовой, например VARIANT, _variant_t

Удачи,
Владимир
dmitrdv
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 которая это позволяет
кто нидь знает про нее???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 12:01     Не тривиальное использование шаблонов
Еще ссылки по теме:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
25.04.2012, 12:01     Не тривиальное использование шаблонов #7
Существует несколько классов-оберток для структуры VARIANT, самые распространенные - это _variant_t и CComVariant, судя по всему, второй класс как раз умеет выполнять операции сравнения:
http://msdn.microsoft.com/library/en...ss_Members.asp

Удачи,
Владимир
Yandex
Объявления
25.04.2012, 12:01     Не тривиальное использование шаблонов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru