gpt4 book ai didi

c++ - 如何在 C++11 中捕获函数参数并存储函数指针以供以后执行?

转载 作者:行者123 更新时间:2023-12-02 01:48:05 25 4
gpt4 key购买 nike

我的要求是存储一些函数以便以后使用预定义的参数执行。这是我尝试过的

void doSomething(int i, int j) {
std::cout << "Sum " << i + j << std::endl;
}

int main(int argc, char *argv[]) {
std::vector<std::function<void(int, int)>> functionVector;

functionVector.push_back(std::bind(doSomething, 1, 2));
functionVector.push_back(std::bind(doSomething, 4, 2));

functionVector[0]();
functionVector[1]();
}

但是这不会编译并给出以下错误

error: no matching function for call to object of type 'std::__1::__vector_base<std::__1::function<void (int, int)>,
std::__1::allocator<std::__1::function<void (int, int)> > >::value_type' (aka 'std::__1::function<void (int, int)>')
functionVector[0]();
^~~~~~~~~~~~~~~~~

如何在 C++11/14 中实现此目的?

最佳答案

将参数绑定(bind)到函数后,调用不再接受任何其他参数。因此函数类型应该是void() :

std::vector<std::function<void()>> functionVector;
<小时/>

另请注意,您可以在 C++11 及更高版本中使用 lambda,这比 std::bind 更灵活:

functionVector.push_back([](){ doSomething(1, 2); });
functionVector.push_back([](){ doSomething(4, 2); });

或者稍微简化一下,可以省略空参数列表:

functionVector.push_back([]{ doSomething(1, 2); });
functionVector.push_back([]{ doSomething(4, 2); });

正如您所看到的,这里的 lambda 表达式没有任何参数,因此它们的调用运算符的类型为 void() .

<小时/>

虽然它不会有任何真正的区别,但我也建议您使用 emplace_back (自 C++11 起)而不是 push_back .

push_back需要对元素类型的引用(此处 std::function<void()> ),但由于您传递的是其他内容,所以 std::function<void()>首先将被 build 为 push_back 的临时设施。参数,然后根据它移动构造 vector 元素。

emplace_back另一方面,需要 vector 元素的构造函数参数,并将构造 std::function<void()>直接就地对象,无需中间临时。

<小时/>

在这个特定实例中std::function使用 lambda 时也是不必要的,因为 lambda 不捕获函数指针的衰减,您可以将其存储为 std::function 的轻量级替代品。 :

std::vector<void(*)()> functionVector;

如果您打算通过捕获来存储 lambda,则 std::function需要方法。

关于c++ - 如何在 C++11 中捕获函数参数并存储函数指针以供以后执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59128126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com