Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector шаблонов / 10 сообщений из 10, страница 1 из 1
28.04.2005, 19:02
    #33041562
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
можно ли хранить в 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
28.04.2005, 19:19
    #33041594
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
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
28.04.2005, 19:22
    #33041599
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
Вектор шаблонов нельзя. А вот то что ты попытался сделать с помощью базового класса можно решить с помощью 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
28.04.2005, 19:25
    #33041604
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
2 MasterZiv
А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ...

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

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

Код: 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
28.04.2005, 19:39
    #33041635
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
ну, нагрузили :-)
в принципе, про буст я давно понял, что чтобы я ни придумал, там это давно есть :-)

но так тяжело себя заставить с ним разбираться...
...
Рейтинг: 0 / 0
29.04.2005, 11:01
    #33042276
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
Анатолий Широков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
29.04.2005, 11:07
    #33042297
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector шаблонов
2 Alex_VC

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


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

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

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

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

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


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

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


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

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

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


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


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