为什么以及如何在C ++中将bind()用作谓词?

问题描述 投票:1回答:5

我得到了这个看起来很奇怪的std :: generate()函数,该函数创建a和b之间随机数的std :: vector。

int myrand(int a, int b)
{
    int div = b-a;
    return a + (rand() % (b-a));
}

int main()
{
    vector<int> v(20);
    generate( v.begin(), v.end(), bind(myrand,1, 11) );  //fill with random no. bwt 1 and 10 
    return 0;
}

我知道std :: generate()函数的工作方式,必须将谓词传递给第三个参数。谓词可以采用函数,函数对象或函数指针的形式。

但是我对表达式bind(myrand,1, 11)感到很困惑,为什么我们必须这样写?

我知道bind返回的函数可以在此处作为第三个参数放置。

但是myrand也是函数吗?我试图用[myrand(1,11)替换第三个参数,但是它不起作用,为什么会这样?

c++ c++11
5个回答
4
投票

std::bind接受一个功能对象,以及您想要传递给该功能对象的东西,并返回一个功能对象,该对象将使用这些参数调用提供的功能对象。这意味着

auto foo = bind(myrand,1, 11);
foo();

与]相同>

myrand(1, 11);

尽管为了使生活更轻松,您可以避免使用bind,而只使用lambda。这样做会给你

generate( v.begin(), v.end(), [](){ return myrand(1, 11); });

而且,至少对我来说,这很清楚,您得到的对象是每次调用它的myrand(1, 11)都将返回operator()


3
投票

std::bind不返回函数,它返回已实现的函数调用运算符std::bindobject


3
投票

绑定返回可调用对象。当您绑定int的两个参数时,生成的callbale将不带任何参数。可以像


2
投票

为什么...使用bind()


0
投票

但是我对表达式int非常困惑,为什么我们必须这样写吗?

© www.soinside.com 2019 - 2024. All rights reserved.