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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
#1

Шаблоны - C++

25.04.2011, 23:50. Просмотров 2446. Ответов 23
Метки нет (Все метки)

Пусть есть шаблон-структура.
C++
1
2
3
4
template <class Data> struct A
{
   Data p;
};
И есть указатели на объекты:
C++
1
2
A<int> *b;
A<float> *c;
Можно ли как-то завести общий указатель для них? т.е. чтоб этот указатель мог указывать и на A<int> и на A<float>?

Пробовал завести родителя (пусть parA) для struct A и создавал указатель этого типа и делал так:
C++
1
2
A<int> *b;
parA * w = b;
Максимум что получилось, это вызвать конструктор через этот указатель:
C++
1
w = new A<int>;
Доступа же к полям не получил. Пробовал явно преобразовывать тип:
C++
1
(A * w).A;
Вылазеет ошибка E2102 Cannot use template 'A<Data>' without specifying specialization parameters
Пробовал сделать родительский класс parA виртуальным и далее через виртуальные методы. Компилятор проглатывает, но ошибка уже на этапе выполнения (ошибка доступа к памяти).

Как быть?


p.s. нужно реализовать стек, элементы которого имеют поля разного типа, а union не охота использовать.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2011, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны (C++):

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) - C++
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны - C++
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template&lt;class type&gt; struct link { type...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
26.04.2011, 00:00 #2
darkAngel, boost::any))
1
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
26.04.2011, 15:08  [ТС] #3
не доверяю я STL.
Сделал стек из union.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.04.2011, 16:07 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от darkAngel Посмотреть сообщение
не доверяю я STL
*саркастично* Молодец.

boost::any это не STL, это boost. Но ему тоже доверять не надо, ага.

Цитата Сообщение от darkAngel Посмотреть сообщение
Сделал стек из union.
*ещё более саркастично* Молодец.
3
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
26.04.2011, 16:39  [ТС] #5
Евгений Ваганыч?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
27.04.2011, 00:06 #6
darkAngel, не доверять библиотекам, написанным профессионалами по С++ - глупо.
0
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
27.04.2011, 00:41  [ТС] #7
дело в перегрузке функционала + могут понадобиться нестандартные функции + свои структуры данных я могу подстраивать под свою задачу (например правильно расположить данные для SSE-инструкций). Мне важна скорость, а не универсальность.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
27.04.2011, 01:01 #8
darkAngel, Не столь сильно уменьшается скорость, все же в boost и stl люди тоже думали о производительности)
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
27.04.2011, 02:22 #9
darkAngel, опиши задачу подробнее. Возможно, можно сделать по-другому.

Кстати, на будущее: важно не абсолютное время работы (одна миллисекунда против двух), а асимптотическое. То есть пропорция, с которой растёт время выполнения программы с увеличением числа входных данных. Так вот в СБШ (стандартной библиотеке шаблонов, она же STL) с этим всё в порядке. Иначе говоря, нужно составлять быстрый алгоритм, а не лезть в дебри излишней оптимизации.
0
darkAngel
Технофашист
215 / 198 / 4
Регистрация: 11.03.2009
Сообщений: 865
27.04.2011, 09:53  [ТС] #10
Я оперирую с большими объёмами данных и вычислений. Для мне каждая лишняя миллисекунда в итоговой картине заметна.

опиши задачу подробнее. Возможно, можно сделать по-другому
Ну нужно было что-то вроде стека - добавляются в конец элементы, но удалять и просматривать можно любой элемент (по индексу).
В стеке хранятся элементы разного типа.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.04.2011, 11:00 #11
Цитата Сообщение от darkAngel Посмотреть сообщение
Ну нужно было что-то вроде стека -добавляются в конец элементы, но удалять и просматривать можно любой элемент (по индексу)
Это называется вектор (std::vector), но вы ему тоже не доверяете...

Цитата Сообщение от darkAngel Посмотреть сообщение
Для мне каждая лишняя миллисекунда в итоговой картине заметна.
union'ы могут ооооочень сильно снизить производительность, т.к. компилятор не может выполнить ряд оптимизаций из-за неизвестности типа, с которым происходит работа.

Цитата Сообщение от darkAngel Посмотреть сообщение
В стеке хранятся элементы разного типа
По нормальному реализуй полиморфизм и усё.
0
Evg
Эксперт CАвтор FAQ
17826 / 6036 / 388
Регистрация: 30.03.2009
Сообщений: 16,567
Записей в блоге: 26
27.04.2011, 13:14 #12
Цитата Сообщение от darkAngel Посмотреть сообщение
Ну нужно было что-то вроде стека - добавляются в конец элементы, но удалять и просматривать можно любой элемент (по индексу)
Это массив из union'ов. Массив можно органищовывать хоть ручками, хоть через std::vector - принципиальной разницы нет. В том числе и с точки зрения скорости. Разница будет только при неправильном подходе к задаче

Цитата Сообщение от darkAngel Посмотреть сообщение
Для мне каждая лишняя миллисекунда в итоговой картине заметна
Когда речь идёт о миллисекундах, то "производительность" и "шаблон" - понятия несовместимые, потому как компилятор не имеет права inline'ить шаблонную функцию или метод. Кроме случаев специализации, но если всё специализировать - тогда нафига вообще связываться с шаблоном.

Цитата Сообщение от Deviaphan Посмотреть сообщение
union'ы могут ооооочень сильно снизить производительность, т.к. компилятор не может выполнить ряд оптимизаций из-за неизвестности типа, с которым происходит работа.
Бред. Попробуй привести хотя бы один пример, где из-за union'а производительность снижается. И хотя бы одну оптимизацию, которая не сможет построиться
1
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.04.2011, 13:28 #13
Цитата Сообщение от Evg Посмотреть сообщение
потому как компилятор не имеет права inline'ить шаблонную функцию или метод.
C какого перепугу?

Цитата Сообщение от Evg Посмотреть сообщение
хотя бы один пример
Если бы я знал, как работает компилятор, я был бы одним из его разработчиков. Модификатор __restrict говорит нам о том, что union мешает оптимизации. Какой именно - вопрос к разработчикам компилятора.

Добавлено через 5 минут
Между прочим, миллисекунда это ОЧЕНЬ много. За одну тысячную секунды столько успевается сделать, что пипец просто...
0
Evg
Эксперт CАвтор FAQ
17826 / 6036 / 388
Регистрация: 30.03.2009
Сообщений: 16,567
Записей в блоге: 26
27.04.2011, 13:34 #14
Цитата Сообщение от Deviaphan Посмотреть сообщение
C какого перепугу?
С такого, что у шаблонной функции может быть специализация. Если компилятор её видит - проинлайнит, но если не видит, то она может быть где-то вдругом месте описана, а потому инлайнить нельзя. И это - 99% случаев

Цитата Сообщение от Deviaphan Посмотреть сообщение
Модификатор __restrict говорит нам о том, что union мешает оптимизации. Какой именно - вопрос к разработчикам компилятора.
Модификатор restrict говорит о том, то обращения по указателю с модификатором restrict не пересекаются с обращениями по другим указателям. Т.е. если мы имеем код:

C
1
2
3
int *p1, *p2;
*p1 = ...
... = *p2;
То компилятор, ничего не зная о p1 и p2 должен полагать (если не сумеет доказать обратное), что чтение из p2 теоретически может быть по тому же адресу, что и запись в p1, а потому эти два обращения зависимы. Но если ты на один из указателей навесишь модификатор restrict, то это подсказка компилятору, что обращения по этому указателю НЕ пересекаются по адресам с обращениями по другим указателям. При таком раскладе чтение из p2 можно переставить выше записи в p1. Процесс чтения из памяти - это более долгая операция, чем запись, особенно если данных ещё в кэше нет, а потому чтения из памяти компилятор всегда старается закинуть как можно выше (раньше по исполнению). Современные процессоры умеютодновременно исполнять несколько инструкций, а потому пока тормозное чтение долго работает, в параллель что-то другое исполняется. restrict является дополнительной подсказкой для оптимизаций. union тут вообще не при чём
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.04.2011, 13:44 #15
Цитата Сообщение от Evg Посмотреть сообщение
Модификатор restrict говорит о том
Его есть два раза. Про первый уже сказано. Второй говорит о том, что в пределах заданного пространства используется только один из типов данных в объединении и компилятор может проводить некоторые оптимизации. Да самое примитивное, занести значение в кэш. Если значение может одновременно использоваться с разными типами, то в кэше его уже не подержишь...

Добавлено через 56 секунд
Цитата Сообщение от Evg Посмотреть сообщение
а потому инлайнить нельзя
Заинтересовало. Можно пруф?

Добавлено через 41 секунду
И Link Time Code Generation никто не отменял. А при нём даже из dll инлайнить могёт, не говоря уже о шаблонах.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2011, 13:44
Привет! Вот еще темы с ответами:

Шаблоны - C++
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual studio...

Шаблоны - C++
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...

Шаблоны - C++
Не пойму что я неправильно делаю. Как не переделывал, всё равно не получалось. Может кто сможет чем помочь. А задача следующая-надо было...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.04.2011, 13:44
Ответ Создать тему
Опции темы

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