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

Как поместить в STL-контейнер экземпляры разных классов? - C++

Восстановить пароль Регистрация
 
 
qppq
 Аватар для qppq
5 / 5 / 1
Регистрация: 31.08.2016
Сообщений: 100
Завершенные тесты: 1
31.08.2016, 10:42     Как поместить в STL-контейнер экземпляры разных классов? #1
Как поместить в контейнер экземпляры разных классов(типов) ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2016, 10:42     Как поместить в STL-контейнер экземпляры разных классов?
Посмотрите здесь:

C++ STL-контейнер.Переделать реализацию.
C++ Как использовать экземпляры классов МFC?
C++ STL контейнер set, вставка элементов
STL, контейнер set C++
Какой STL-контейнер выбрать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GbaLog-
Не Эксперт C++
1522 / 626 / 176
Регистрация: 24.08.2014
Сообщений: 2,542
Записей в блоге: 1
Завершенные тесты: 2
31.08.2016, 10:49     Как поместить в STL-контейнер экземпляры разных классов? #2
Цитата Сообщение от qppq
как запихать в контейнер экземпляры разных классов
Сделать для всех них родительский полиморфный класс и указатели на него пихать?
На счёт типов хз.
Martein
Оператор ЭВМ 6 разряда
 Аватар для Martein
657 / 68 / 12
Регистрация: 22.06.2014
Сообщений: 147
31.08.2016, 10:58     Как поместить в STL-контейнер экземпляры разных классов? #3
Всё смешалось - люди, кони. Если приходиться прибегать к хранению объектов разных типов в одном контейнере, и тем более потом проверять их принадлежность к типу функцией std::dynamic_cast<T*>, то скорее всего архитектура построения зависимостей ваших классов продумана не совсем грамотно. Если это не налагает дополнительных расходов по пересмотрению, вроде переписывания всего проекта в целом, то не стоит прибегать к такой изощрённой схеме. Да и в случае чего отладка таких нагромождений будет достаточно тяжела. Но я в данном вопросе дилетант, так что другие гуру имеют полное право меня пнуть за моё невежество.
qppq
 Аватар для qppq
5 / 5 / 1
Регистрация: 31.08.2016
Сообщений: 100
Завершенные тесты: 1
31.08.2016, 11:02  [ТС]     Как поместить в STL-контейнер экземпляры разных классов? #4
На счёт типов хз.
эээ, тип и класс экземпляра одно и то же, не так ли?
GbaLog-
Не Эксперт C++
1522 / 626 / 176
Регистрация: 24.08.2014
Сообщений: 2,542
Записей в блоге: 1
Завершенные тесты: 2
31.08.2016, 11:08     Как поместить в STL-контейнер экземпляры разных классов? #5
Martein, Да нет, Вы всё правильно говорите( хоть я и не эксперт ). Просто я дал ТСу ответ на тот вопрос, который он задал, вернее, на часть вопроса.

Добавлено через 3 минуты
qppq, Ну тип может быть фундаментальным, например: int, char, double, etc. Это не классы и им нельзя приписать родителей. К классам из библиотеки STL, кстати, тоже нельзя. В общем можно только свои классы пихать, как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
///////////////////////////////////////////////////////////
#include <vector>
///////////////////////////////////////////////////////////
struct A
{
    virtual ~A() {};
};
 
struct B : A
{
    //some code
};
 
int main()
{
    std::vector< A* > vec;
    vec.push_back( new B() );
}
HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
31.08.2016, 11:24     Как поместить в STL-контейнер экземпляры разных классов? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
boost::any
std::any (std::experimental::any)
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
31.08.2016, 11:40     Как поместить в STL-контейнер экземпляры разных классов? #7
ну и есть классический костыль - заворачиваем в одну структуру enum и union.
qppq
 Аватар для qppq
5 / 5 / 1
Регистрация: 31.08.2016
Сообщений: 100
Завершенные тесты: 1
31.08.2016, 12:23  [ТС]     Как поместить в STL-контейнер экземпляры разных классов? #8
HelicopterK52,
boost::any
std::any (std::experimental::any)
можете пояснить?
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
31.08.2016, 20:23     Как поместить в STL-контейнер экземпляры разных классов? #9
Цитата Сообщение от qppq Посмотреть сообщение
можете пояснить?
Что не понятно то? Это части библиотек.

Идиомы С++. Type erasure
http://en.cppreference.com/w/cpp/experimental/any
tapochka
30 / 30 / 7
Регистрация: 25.04.2014
Сообщений: 413
31.08.2016, 23:32     Как поместить в STL-контейнер экземпляры разных классов? #10
C++
1
2
3
4
std::vector<void*> ve;
        ve.push_back((void*)new int(3));
        ve.push_back((void*)new std::string("hello"));
        std::cout<<*(int*)ve.at(0)<<" "<<*(std::string*)ve.at(1)<<std::endl;
а вообще раз уж пошла такая пьянка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<boost/variant.hpp>
 
struct my_struct {
    friend std::ostream& operator<<(std::ostream& os, my_struct& t) {
        os<<"my_struct";
        return os;
    }
};
 
struct visit : public boost::static_visitor<>
{
    template<typename T>
    void operator()(T& t) const {
        std::cout<<t<<std::endl;
    }
};
 
int main() {
using variant = boost::variant<std::string, my_struct, int, float>;
        std::vector<variant> ve;
        ve.push_back(2.f);
        ve.push_back(1);
        ve.push_back(std::string("hello"));
        ve.push_back(my_struct{});
        std::for_each(std::begin(ve), std::end(ve), [=](auto el) {boost::apply_visitor(visit(), el);});
}
qppq
 Аватар для qppq
5 / 5 / 1
Регистрация: 31.08.2016
Сообщений: 100
Завершенные тесты: 1
01.09.2016, 10:14  [ТС]     Как поместить в STL-контейнер экземпляры разных классов? #11
а как идентифицировать какой тип данных в ячейке при чтении из контейнера
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
01.09.2016, 10:25     Как поместить в STL-контейнер экземпляры разных классов? #12
Цитата Сообщение от qppq Посмотреть сообщение
а как идентифицировать какой тип данных в ячейке при чтении из контейнера
А полиморфные объекты на то и полиморфные чтобы ничего не идентифицировать. У них есть абстрактное действие/действия. Вызываешь для нужного/каждого как для абстрактного предка а каждый его выполняет по своему.
qppq
 Аватар для qppq
5 / 5 / 1
Регистрация: 31.08.2016
Сообщений: 100
Завершенные тесты: 1
01.09.2016, 10:40  [ТС]     Как поместить в STL-контейнер экземпляры разных классов? #13
то есть нада помнить что-где лежит?
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
01.09.2016, 11:02     Как поместить в STL-контейнер экземпляры разных классов? #14
Цитата Сообщение от qppq Посмотреть сообщение
то есть нада помнить что-где лежит?
http://en.cppreference.com/w/cpp/experimental/any/type
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,151
Записей в блоге: 2
01.09.2016, 11:09     Как поместить в STL-контейнер экземпляры разных классов? #15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А полиморфные объекты на то и полиморфные чтобы ничего не идентифицировать.
А мне нравится когда можно идентифицировать.
Цитата Сообщение от qppq Посмотреть сообщение
то есть нада
использовать динамически типизированные языки типа Java и C#, и их instance of и is. Как в плюсах с этим, не знаю. Может any решает этот вопрос, не ясно ценой какого оверхеда.

ЗЫ о, пока набирал уже написали про type_id.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
01.09.2016, 11:12     Как поместить в STL-контейнер экземпляры разных классов? #16
Цитата Сообщение от _Ivana Посмотреть сообщение
не ясно ценой какого оверхеда.
Какая может быть цена, если сам ничего руками не пишешь?
И согласен если не нужна типизация, то вероятно стоит подумать о том что бы встроить в программу что-то скриптовое например python или lua
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,151
Записей в блоге: 2
01.09.2016, 11:16     Как поместить в STL-контейнер экземпляры разных классов? #17
Цитата Сообщение от Avazart Посмотреть сообщение
Какая может быть цена
За боксинг-анбоксинг и типоопределитинг. Например, делать структуру с указателем на void и полем char *typename - достаточно дорого, помимо выделения памяти и запаковки приходится строку читать и сравнивать.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
01.09.2016, 11:25     Как поместить в STL-контейнер экземпляры разных классов? #18
Цитата Сообщение от _Ivana Посмотреть сообщение
делать структуру с указателем на void и полем char *typename - достаточно дорого
Вместо typename- typeid т.е. целое, а не строка.
И дорого в сравнении с чем? "Скрипты" под капотом ведь скорее всего поступают также.
_Ivana
2189 / 1394 / 124
Регистрация: 01.03.2013
Сообщений: 4,151
Записей в блоге: 2
01.09.2016, 11:27     Как поместить в STL-контейнер экземпляры разных классов? #19
В сравнении с теми же приведенными instance of и is в Шарпе и Джаве. Там это не вручную скриптами под капотом и не либами поверх ядра, там это в самом ядре языка сделано и компилируется не в парсинг строкового имени типа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2016, 11:29     Как поместить в STL-контейнер экземпляры разных классов?
Еще ссылки по теме:

Какой контейнер STL выбрать? C++
C++ STL контейнер. Не записывает int
C++ STL контейнер ошибка компиляции

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
01.09.2016, 11:29     Как поместить в STL-контейнер экземпляры разных классов? #20
Цитата Сообщение от _Ivana Посмотреть сообщение
там это в самом ядре языка сделано и компилируется не в парсинг строкового имени типа.
А ядро языка на чем пишется и как? обычно на Си и ровно так же...
Yandex
Объявления
01.09.2016, 11:29     Как поместить в STL-контейнер экземпляры разных классов?
Ответ Создать тему

Метки
как
Опции темы

Текущее время: 02:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru