Расширить конструкторы std::function для bound аргументов функции

Antervis
Antervis

Идея: поменять конструкторы (5) и (10) std::function::function (cppreference) c:

template< class F >
function( F f );

template< class F, class Alloc >
function( std::allocator_arg_t, const Alloc& alloc, F f );

на:

template< class F, class ...Args >
function( F f, Args &&...args );

template< class F, class Alloc, class ...Args >
function( std::allocator_arg_t, const Alloc& alloc, F f, Args &&...args );

// possible implementation:

// declared and implemented as before
template< class F >
function( F f );

template< class F, class Alloc >
function( std::allocator_arg_t, const Alloc& alloc, F f );

// overriden for more than 1 argument
template< class F, class ...Args >
function( F &&f, Args &&...args ) {
    return function(bind(forward<F>(f), forward<Args>(args)...));
}

template< class F, class ...Args >
function( std::allocator_arg_t, const Alloc& alloc, F &&f, Args &&...args ) {
    return function( allocator_arg, alloc, bind(forward<F>(f), forward<Args>(args)...));
}

По факту, это синтаксический сахар, который позволит в некоторых контекстах, принимающих std::function, опустить std::bind:

void putToQueue(std::function<void()> f);

// До:
putToQueue(std::bind(&func, arg1, arg2));
// После:
putToQueue({&func, arg1, arg2});

 

-2
рейтинг
4 комментария
yndx-antoshkka
Комитет уходит от std::bind по возможности, так как с ним есть большие нерешаемые проблемы в случае если используются placeholder.

Ваш пример работает и хорошо себя показывает из-за того, что сигнатура функции void() (как и в случае с std::thread который делает bind).

Если сигнатура будет void(string&&, string&&), то вызов std::function<void(string&&, string&&)>(foo, _1, _1) приведёт к ошибке на рантайме. Получается, что все болезни std::bind перенесутся на std::function и в итоге станет хуже.
yndx-antoshkka
dix75
yndx-antoshkka, Уходит?
а что в замен?
dix75
yndx-antoshkka
dix75, generic lambda
yndx-antoshkka
Antervis
yndx-antoshkka, ваш пример и в виде лямбды некошерен:
[](string &&s) { return foo(std::move(s), std::move(s)); }
Antervis
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).