Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.06.2014, 20:40
|
|||
|---|---|---|---|
[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
|
|||
|---|---|---|---|
|
|||
[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
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
А вообще конечно, вот эти for_each - извращение. Пишите проще и к вам потянутся люди. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 21:43
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
Да, и забыл добавить, что уже много лет как никто не говорит C++0x Давно уже С++11 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.06.2014, 22:54
|
|||
|---|---|---|---|
[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
|
|||
|---|---|---|---|
|
|||
[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
|
|||
|---|---|---|---|
|
|||
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
А вот в этом коде, да, копируется Код: plaintext 1. Поэтому если важна скорость, то делается так Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2014, 00:38
|
|||
|---|---|---|---|
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
Anatoly MoskovskyДанное утверждение ложно. Да знаем мы. ТС надо вообще так, если хочется с bind-ом. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2014, 00:40
|
|||
|---|---|---|---|
[C++0x] std::for_each iterate over std::vector< std::shared_ptr< Foo > > |
|||
|
#18+
И не забыть про Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&tablet=1&tid=2019397]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 294ms |
| total: | 486ms |

| 0 / 0 |
