powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector шаблонов
10 сообщений из 10, страница 1 из 1
vector шаблонов
    #33041562
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно ли хранить в vectorе набор объектов одноко шаблона но разной реализации?

я думал сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template <class T> struct test
{
 T value;
};

vector <test > v;
test<int> i;
v.push_back(i);
test<string> s;
v.push_back(s);
ясно, у меня даже vector не получился :-)

тогда я решил сбацать примитивный базовый класс и отнего отнаследовать шаблон:
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
#include <stdio.h>
#include <string>
#include <vector>

struct basetest
{
 std::string name;
};

template <class T> struct test:public basetest
{
 T value;
};

int main()
{
 test<int>* i=new test<int>;
 i->value= 100 ;
 i->name="test";
 std::vector<basetest*> v;
 v.push_back(i);

 test<std::string>* s=new test<std::string>;
 s->value="value";
 s->name="test";
 v.push_back(s);

 test<int>* ii=(test<int>*)v[ 0 ];
 test<std::string>* ss=(test<std::string>*)v[ 1 ];

 printf("%s %i\n",ii->name.c_str(),ii->value);
 printf("%s %s\n",ss->name.c_str(),ss->value.c_str());

 delete i;
 delete s;
}
так, конечно, работает.
а можно как-то без базового класса?

только не спрашивайте зачем, сам еще не придумал :-)
в качестве понимания и обучения....
...
Рейтинг: 0 / 0
vector шаблонов
    #33041594
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kможно ли хранить в vectorе набор объектов одноко шаблона но разной реализации?

Нет. В языке С++ разные инстанциации одного и того же шаблона - вообще никак друг с другом несвязанные классы.

alex_k
vector <test > v;

Уже здесь должно быть
vector < test<string> > v;
или
vector < test<int> > v;

test - это вообще не тип данных - это шаблон. Чтобы он стал типом данных, он должен быть инстанциирован.

alex_k
тогда я решил сбацать примитивный базовый класс и отнего отнаследовать
шаблон:


Это правильное решение.
Вот только с замечательной стандартной библиотекой STL оно...
непрокатывает.

alex_k
std::vector<basetest*> v;


Ты молодец, что не написал
std::vector<basetest> v;
или
std::vector<basetest&> v;

А знаешь, почему ?

alex_k
так, конечно, работает.
а можно как-то без базового класса?


Нет.

alex_k
в качестве понимания и обучения....


Маладец учись.

У тебя все хорошо в коде, и все будет работать.
До тех пор, пока ты не задумаешься и не захочешь, чтобы этих вот операторов
не было :
delete i;
delete s;

А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ...

Но тут ты сильно обломишься, потому что этого сделать нельзя. Потому что в стандартной библиотеке STL такое сделать вообще невозможно. Такая вот у нас смешная стандартная библиотека.
...
Рейтинг: 0 / 0
vector шаблонов
    #33041599
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вектор шаблонов нельзя. А вот то что ты попытался сделать с помощью базового класса можно решить с помощью boost::any и главное решить безопастно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include "boost/any.hpp"
#include <vector>

int main()
{
      std::vector<boost::any> arr;

      arr.push_back(boost::any(std::string("hi")));
      arr.push_back(boost::any( 1 ));
      std::cout << boost::any_cast<std::string>(arr[ 0 ]) << '\n';
      std::cout << boost::any_cast<int>(arr[ 1 ]) << '\n';
}
...
Рейтинг: 0 / 0
vector шаблонов
    #33041604
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MasterZiv
А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ...

C какого перепугу std::vector будет удалять хранимые им указатели? Нет, все ручками:

struct delete_object
{
template<typename T>
T* operator()(T *ptr) const
{
delete ptr;
return 0;
}
};
...
Рейтинг: 0 / 0
vector шаблонов
    #33041615
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дописал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct delete_object
{
    template<typename T>
    T* operator()(T *ptr) const
    {
       delete ptr;
       return  0 ; 
    }
};
struct base {virtual ~base(){}};
...
std::vector<base*> arr;
...
// только в ручную можно освободить память занимаемую элентами
std::transform(arr.begin(), arr.end(), arr.begin(), delete_object());
...
Рейтинг: 0 / 0
vector шаблонов
    #33041635
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, нагрузили :-)
в принципе, про буст я давно понял, что чтобы я ни придумал, там это давно есть :-)

но так тяжело себя заставить с ним разбираться...
...
Рейтинг: 0 / 0
vector шаблонов
    #33042276
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 MasterZiv
А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ...

C какого перепугу std::vector будет удалять хранимые им указатели? Нет, все ручками:

struct delete_object
{
template<typename T>
T* operator()(T *ptr) const
{
delete ptr;
return 0;
}
};

А std::auto_ptr - не катит?
...
Рейтинг: 0 / 0
vector шаблонов
    #33042297
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alex_VC

std::vector<std::auto_ptr<T> > - запрещенная стандартом конструкция, так как std::auto_ptr не удовлетворяет требованию стандартных контейнеров быть Copyable. А вот std::vector<boost::share_ptr<T> > пожалуйста используйте на здоровье.
...
Рейтинг: 0 / 0
vector шаблонов
    #33045193
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 MasterZiv
А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ...


Я нифига не понял, на что это ты отвечаешь. На какой такой вопрос.

Анатолий Широков
C какого перепугу std::vector будет удалять хранимые им указатели? Нет, все ручками:

Ну ясно, что сам не станет, и это правильно. Но вот что никакими ухищрениями его это делать заставить нельзя - это бред полный.
Я котгда разобрался с этим делом - я вообще охренел , у них там ситуация удаления элемента из коллекции принципиально ничем неотличима от ситуации перемещения элементов в новое хранилище ( т.е. на самом деле от ситуации удаления из старого хранилища ).

Alex_VC
А std::auto_ptr - не катит?

На счет std::auto_ptr - это даже не смешно . Потому что грустно.
...
Рейтинг: 0 / 0
vector шаблонов
    #33045218
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Я нифига не понял, на что это ты отвечаешь. На какой такой вопрос.


Ты что, своих слов не узнал - это твои слова на счет виртуального конструктора, а не мои.

MasterZiv
Я котгда разобрался с этим делом - я вообще охренел , у них там ситуация удаления элемента из коллекции принципиально ничем неотличима от ситуации перемещения элементов в новое хранилище ( т.е. на самом деле от ситуации удаления из старого хранилища ).


Ну это касается только std::vector, так как он гарантирует линейное размещение своих элементов и дает произвольной доступ к своим элементам - но за это удовольствие и расплачиваешься дорогой вставкой в произвольное место и дорогим удалением. Используй std::list и у тебя будет удаление за O(1), но не будет произвольного доступа и память выделенная под элементы будет разбросана по куче.

Так что, нельзя так однобоко оценивать STL - копай глубже.

MasterZiv
На счет std::auto_ptr - это даже не смешно. Потому что грустно.


Опять одни эмоции. Конкретнее давай.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector шаблонов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]