使用std :: bind分别绑定参数和对象实例

时间:2016-08-08 10:43:09

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

是否可以将参数绑定到成员函数调用,然后单独绑定目标对象?

我想要实现的是一个辅助函数,它接收一个带有任意参数的函数作为参数,然后对集合中的所有项执行它。

void SomeType::Work(UINT a, UINT b, UINT c)
{
    //do something
}

template<typename Function, class Container>
void Execute(const Function& fn, const Container& collection)
{
    for(auto& item : collection)
    {
        auto bound = std::bind(fn, &item);
        bound();
    }
}

void Test()
{
    //eg. container = vector of SomeType
    auto fn = std::bind(&Sometype::Work, 10, 20, 30);
    Execute(fn, container);
}

失败了,功能上出现了一些错误:

error C2064: term does not evaluate to a function taking 3 arguments

最终指着:

see reference to function template instantiation 'void Execute<std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall SomeType::* )(UINT,UINT,UINT),void,SomeType,UINT,UINT,UINT>,UINT &,UINT &,UINT &>>(const Function &)' being compiled
with
[
    Function=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall SomeType::* )(UINT,UINT,UINT),void,SomeType,UINT,UINT,UINT>,UINT &,UINT &,UINT &>
]

我通过传入一个捕获所需值的lambda并在传递给它的对象上执行所需的函数来解决它。我仍然想知道这种方式的绑定功能是否有任何支撑,我只是错了,或者它是不可行的。

2 个答案:

答案 0 :(得分:4)

当绑定成员函数Sometype::Work()时,您应该为第二次绑定时绑定的目标对象留下占位符。

试试这个:

using namespace std::placeholders;
auto fn = std::bind(&Sometype::Work, _1, 10, 20, 30);
                                     ~~

LIVE

答案 1 :(得分:0)

听起来你只想将一个函数(带有特定参数)应用于集合。

我没有看到与使用具有特定功能的std::for_each有何不同。

void Test()
{
    //eg. container = vector of SomeType
    auto fn1 = [/*whatever*/](const container_value_type& obj) { 
        Sometype::Work(10, 20, 30, obj);
    }
    auto fn2 = [/*whatever*/](const container_value_type& obj) { 
        Sometype::Work(40, 50, 60, obj);
    }
    std::for_each(container.begin(), container.end(), fn1);
    std::for_each(container.begin(), container.end(), fn2);
}