LINUX.ORG.RU

c++ bind

 


0

1

Как это работает? (из Effective Modern C++

auto setSoundB =
    std::bind(setAlarm,
              std::bind(std::plus<>,
                        std::bind(steady_clock::now),
                        1h),

              _1,
              30s);

Если посмотреть на объявление bind:

http://en.cppreference.com/w/cpp/utility/functional/bind

то

args - list of arguments to bind, with the unbound arguments replaced by the placeholders _1, _2, _3... of namespace std::placeholders

т.е. после второго аргумента мы передаем или аргументы или плейсхолдеры, но никак не вызываемые объекты (т.е. к ним не будет применен operator()). Каким же образом передача bind как аргумента другого bind может работать?

★★

Последнее исправление: dissident (всего исправлений: 1)

If the stored argument arg is of type T for which std::is_bind_expression<T>::value == true (for example, another bind expression was passed directly into the initial call to bind), then bind performs function composition: instead of passing the function object that the bind subexpression would return, the subexpression is invoked eagerly, and its return value is passed to the outer invokable object.

anarch
()

А нафиг тебе ентот бинт в c++14? Или в теги не смок?

Scott Meyers gave a talk about this. This is what I remember:

In C++14 there is nothing useful bind can do that can't also be done with lambdas.

In C++11 however there are some things that can't be done with lambdas: ...

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Просто хотелось понять, как это работает. Спасибо за ответы!

dissident ★★
() автор топика
Ответ на: комментарий от slackwarrior

Интересно мнение публики, что лучше из сортов:

async_write(sock, ft.result(), [this, ft](const error_code &ec, size_t)
    {
        on_sended(ec, ft);
    });
или
using namespace boost::asio::placeholders;

async_write(sock, ft.result(), boost::bind(&client::on_sended, this, error, ft));

anonymous
()
Ответ на: комментарий от anonymous

Ну Мейерс разрешил жы первое: «Всем ламбада, посоны!» :) Многие в 13-м году вопрос закрыли в пользу лямбд, сурьезно пободавшись на тему способов, где бинт «решает» — приводили какие-то сорта аргументов за с++0х и с++11 — из с++14 на них смотрели как на «сорта».

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Да понятно что оба работают, я ж как эстет к эстету... Сам заменил первый вариант на второй. Лямбда как-то тяжело выглядит, а у bind тут хорошие placeholders.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.