
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.06.2014, 20:40:30
|
|||
|---|---|---|---|
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
Доброго времени суток. Начну с того, что я упоролся мне нужно вызвать определённый метод у объектов, указатели которых хранятся в shared_ptr'ах, объекты которых хранятся в std::vector. Столкнулся с проблемой компиляции, ловя вырвиглазные шаблонные сообщения об ошибках от GCC 4.9 при компиляции такого кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Скажу сразу, что проблема не в последней строчке. Нужно как-то завернуть то, что вернёт std::shared_ptr< Node >::get в вызов Node::render как первый аргумент, раз это member_function. Как же это сделать? Опыта работы с boost::bind не особо-то много, как и с std::bind. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 21:33:04
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
NekZ, Вам вообще не надо трогать метод get из смартуказателя. У смартуказателей автоматически вызываются методы вложенного класса. Два уровня bind тут также не нужны. Надо только правильно привязать метод с помощью bind. Так как метод render имеет неявный аргумент this то его нужно считать первым аргументом в bind, а остальные аргументы сразу привязать. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 21:40:42
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
А вообще конечно, вот эти for_each - извращение. Пишите проще и к вам потянутся люди. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 21:43:43
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
Да, и забыл добавить, что уже много лет как никто не говорит C++0x Давно уже С++11 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 22:54:05
|
|||
|---|---|---|---|
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
NekZ for_each реализован так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. В обработчик for_each, будет передаваться *std::vector< std::shared_ptr< Node > >::iterator, то есть std::shared_ptr< Node >. А это приведёт к созданию каждый раз нового std::shared_ptr< Node >, конструктором копирования и его уничтожении. при выходе. А это будет приводить к атомарным операциям с счётчиком этих std::shared_ptr< Node >. Оно надо? Крутите цикл по старинке. Код: plaintext 1. 2. И вообще в контейнеры помещают unique_ptr, так быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 23:34:49
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
smaldВ обработчик for_each, будет передаваться *std::vector< std::shared_ptr< Node > >::iterator, то есть std::shared_ptr< Node >. А это приведёт к созданию каждый раз нового std::shared_ptr< Node >, конструктором копирования и его уничтожении. Данное утверждение ложно. Дело в том что когда в коде Код: plaintext 1. , fn это bind на основе метода, то ничего никуда не копируется, а весь код инлайнится в такую конструкцию: Код: plaintext 1. которая в свою очередь разворачивается в такую: Код: plaintext 1. Как видим никакого копирования смартуказателя не происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 23:37:00
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
А вот в этом коде, да, копируется Код: plaintext 1. Поэтому если важна скорость, то делается так Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2014, 00:38:51
|
|||
|---|---|---|---|
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
Anatoly MoskovskyДанное утверждение ложно. Да знаем мы. ТС надо вообще так, если хочется с bind-ом. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2014, 00:40:21
|
|||
|---|---|---|---|
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
И не забыть про Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2019397]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 503ms |

| 0 / 0 |
