опустить std :: заполнители в std :: bind

Вот что я делаю для создания std :: function: -

std::function<void(int,int,int)> f=
    std::bind(&B::fb,this,
        std::placeholders::_1,
        std::placeholders::_2,
        std::placeholders::_3
    );  

void B::fb(int x,int k,int j){} //example

Очевидно, что B::fb получает три параметра.
Чтобы повысить удобочитаемость и удобство обслуживания, я хотел бы вместо этого назвать это: -

std::function<void(int,int,int)> f=std::bind(&B::fb,this);  //omit _1 _2 _3

Вопрос
Есть ли в C ++ функции, позволяющие опускать заполнители?
Он должен автоматически вызывать _1, _2, ... в порядке следования.

Я погуглил "опустить заполнители c ++", но не нашел ни одной подсказки.


person javaLover    schedule 31.07.2016    source источник
comment
Вы не можете пропустить заполнители. Помните, что B::fb может быть перегружен.   -  person KayEss    schedule 31.07.2016
comment
Затем сделайте так, чтобы он выдал мне неоднозначную ошибку компиляции.   -  person javaLover    schedule 31.07.2016
comment
Что ж, если вы не укажете стимуляторы, прямо сейчас будет выдана ошибка. Не двусмысленный, но достаточно близкий.   -  person Revolver_Ocelot    schedule 31.07.2016
comment
Благодарить. Мне не нужна ошибка компилятора, когда заполнители опущены. Упомянутая ошибка компилятора должна произойти, только если B::fb перегружен.   -  person javaLover    schedule 31.07.2016
comment
Вы знаете, что B::fb не перегружен, но спецификация языка этого не знает. Есть несколько ретроспективных работ, направленных на стандартизацию. Вероятно, вам нужно подождать, прежде чем вы сможете решить эту проблему.   -  person KayEss    schedule 31.07.2016
comment
@KayEss B :: fb также может быть перегружен тем же количеством аргументов, и в этом случае компилятор выдаст ошибку.   -  person n. 1.8e9-where's-my-share m.    schedule 31.07.2016
comment
Почему бы вам не использовать лямбда с auto... в качестве параметра, который нужно перенаправить в нужную функцию?   -  person skypjack    schedule 31.07.2016
comment
Решит ли карри вашу проблему?   -  person Yakk - Adam Nevraumont    schedule 31.07.2016


Ответы (1)


Вы можете создать помощник по функциям (это C ++ 14):

template <class C, typename Ret, typename ... Ts>
std::function<Ret(Ts...)> bind_this(C* c, Ret (C::*m)(Ts...))
{
    return [=](auto&&... args) { return (c->*m)(std::forward<decltype(args)>(args)...); };
}

template <class C, typename Ret, typename ... Ts>
std::function<Ret(Ts...)> bind_this(const C* c, Ret (C::*m)(Ts...) const)
{
    return [=](auto&&... args) { return (c->*m)(std::forward<decltype(args)>(args)...); };
}

а потом просто напиши

std::function<void(int, int, int)> f = bind_this(this, &B::fb);
person Jarod42    schedule 31.07.2016