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

start [/forum/topic.php?fid=57&tid=2019397]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
100ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 203ms |

| 0 / 0 |
