|
|
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
можно ли хранить в vectorе набор объектов одноко шаблона но разной реализации? я думал сделать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. тогда я решил сбацать примитивный базовый класс и отнего отнаследовать шаблон: Код: 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. а можно как-то без базового класса? только не спрашивайте зачем, сам еще не придумал :-) в качестве понимания и обучения.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 19:02 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
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 такое сделать вообще невозможно. Такая вот у нас смешная стандартная библиотека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 19:19 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
Вектор шаблонов нельзя. А вот то что ты попытался сделать с помощью базового класса можно решить с помощью boost::any и главное решить безопастно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 19:22 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
2 MasterZiv А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ... C какого перепугу std::vector будет удалять хранимые им указатели? Нет, все ручками: struct delete_object { template<typename T> T* operator()(T *ptr) const { delete ptr; return 0; } }; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 19:25 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
Не дописал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 19:28 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
ну, нагрузили :-) в принципе, про буст я давно понял, что чтобы я ни придумал, там это давно есть :-) но так тяжело себя заставить с ним разбираться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2005, 19:39 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков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 - не катит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2005, 11:01 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
2 Alex_VC std::vector<std::auto_ptr<T> > - запрещенная стандартом конструкция, так как std::auto_ptr не удовлетворяет требованию стандартных контейнеров быть Copyable. А вот std::vector<boost::share_ptr<T> > пожалуйста используйте на здоровье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2005, 11:07 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков2 MasterZiv А чтобы были они внутри твоего контейнера. Ведь базовый класс есть, он один. Надо всего лишь добавить в него объявление виртуального деструктора, и тогда std::vector сам сможет удалять положенные в него объекты ... Я нифига не понял, на что это ты отвечаешь. На какой такой вопрос. Анатолий Широков C какого перепугу std::vector будет удалять хранимые им указатели? Нет, все ручками: Ну ясно, что сам не станет, и это правильно. Но вот что никакими ухищрениями его это делать заставить нельзя - это бред полный. Я котгда разобрался с этим делом - я вообще охренел , у них там ситуация удаления элемента из коллекции принципиально ничем неотличима от ситуации перемещения элементов в новое хранилище ( т.е. на самом деле от ситуации удаления из старого хранилища ). Alex_VC А std::auto_ptr - не катит? На счет std::auto_ptr - это даже не смешно . Потому что грустно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2005, 23:29 |
|
||
|
vector шаблонов
|
|||
|---|---|---|---|
|
#18+
MasterZiv Я нифига не понял, на что это ты отвечаешь. На какой такой вопрос. Ты что, своих слов не узнал - это твои слова на счет виртуального конструктора, а не мои. MasterZiv Я котгда разобрался с этим делом - я вообще охренел , у них там ситуация удаления элемента из коллекции принципиально ничем неотличима от ситуации перемещения элементов в новое хранилище ( т.е. на самом деле от ситуации удаления из старого хранилища ). Ну это касается только std::vector, так как он гарантирует линейное размещение своих элементов и дает произвольной доступ к своим элементам - но за это удовольствие и расплачиваешься дорогой вставкой в произвольное место и дорогим удалением. Используй std::list и у тебя будет удаление за O(1), но не будет произвольного доступа и память выделенная под элементы будет разбросана по куче. Так что, нельзя так однобоко оценивать STL - копай глубже. MasterZiv На счет std::auto_ptr - это даже не смешно. Потому что грустно. Опять одни эмоции. Конкретнее давай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2005, 00:09 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33041615&tid=2033378]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 441ms |

| 0 / 0 |
