C ++ 0x привязка и функция без копирования-конструкции - PullRequest
1 голос
/ 08 марта 2011

В настоящее время я опробую несколько новых функций C ++ 0x, а именно std :: function и std :: bind.Эти две функции кажутся достаточно подходящими для системы делегатов событий для C ++, которая работает как в C♯.Я уже пытался создать что-то вроде делегатов, но хаки, которые мне понадобились бы для указателей на функции-члены, были для меня многим…

Во время моих тестов я заметил, что std :: bind копирует каждый объектВы связываете.Хотя это, безусловно, повышает безопасность - нельзя удалить все еще зарегистрированный обработчик событий :) - это также проблема с объектами с состоянием.Есть ли способ деактивировать копирование - или, по крайней мере, способ снова получить инкапсулированный объект из std :: function?

PS: Есть ли ссылка на функции, которыебудет включен в C ++ 0x (возможно, в C ++ 11!). В конце концов, это основные части TR1 и несколько дополнений ...

Я попробовал cppreference.org, но они все еще на ранней стадии.На стадии документирования cplusplus.com, с другой стороны, даже не начал прикрывать C ++ 0x.

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Если вы хотите избежать копирования, используйте std::ref и / или std::cref. Они обертывают объект в псевдоссылку

1 голос
/ 08 марта 2011

Не совсем верно, что:

Я заметил, что std :: bind копирует каждый объект, который вы связываете.

По крайней мере, это не предназначеноСпецификация.Вы должны быть в состоянии переместить не подлежащий копированию объект в привязку:

std::bind(f, std::unique_ptr<int>(new int(3)))

Однако теперь, когда объект только для перемещения хранится в связывателе, он становится lvalue.Поэтому вы можете вызвать его, только если f принимает объект lvalue только для перемещения (скажем, по ссылке lvalue).Если это неприемлемо, и если исходный объект переживает связыватель, то использование std::ref является еще одним хорошим решением (как упомянуто Арменом).

Если вам нужно скопировать связанный объект, то всесвязанные аргументы должны быть копируемыми.Но если вы только перемещаете конструкцию связанного объекта, то он будет только перемещать конструкцию своих связанных аргументов.

Лучшая ссылка - N3242 .Я не знаю хорошего и всеобъемлющего учебника.Я мог бы начать с расширенной документации с пониманием того, что std :: bind был адаптирован для работы с rvalue-refs в максимально возможной степени.

0 голосов
/ 14 ноября 2012

Я создал совместимую с ходом версию bind. с ним по-прежнему много проблем, таких как конструктор binders и несколько баггилинов тут и там и т. д., но это похоже на работу

проверить это здесь http://code -slim-jim.blogspot.jp / 2012/11 / идеально-экспедиторской-связывать-with.html-совместимы

...