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

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

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

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

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

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

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

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

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

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

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

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

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

Удачи,
Владимир
0
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 которая это позволяет
кто нидь знает про нее???
0
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

Удачи,
Владимир
0
25.04.2012, 12:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 12:01
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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