在std :: bind中省略std :: placeholders

时间:2016-07-31 05:04:28

标签: c++ c++11 std-function stdbind

要创建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,...。

我用google搜索&#34;省略占位符c ++&#34;但没有找到任何线索。

1 个答案:

答案 0 :(得分:8)

您可以创建函数帮助程序(那些是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);