7

我有一个名为 workForThread 的函数,它接受两个参数并返回 void。我想使用类似的东西来线程这个函数:

thread(workForThread,a,b);

哪里ab是适当的类型。上面的代码无法编译,给出“too many arguments for call”错误(“error C2197: 'void (__cdecl *)(char *)' : too many arguments for call”)

我该如何解决这个问题?

注意:我已经查看了 两个问题,但在那里工作的解决方案似乎对我不起作用。此外,我觉得有一种方法可以在 c++11 中内置,这就是我正在寻找的。

4

2 回答 2

13

在 C++11 中,这样做的方式或多或少是您尝试过的方式:

std::thread myThread(workForThread,a,b);

提供的 workForThread 是一个(非成员)函数,它接受这两个参数。

于 2012-05-07T18:31:54.827 回答
7

使用 C++11 时,您可以使用 lambda 函数,该函数可以使用上下文的(非形式)参数。“捕获”

就像是

void doIt (int a, int b) {  // do something, your workForThread
}

..
int a = 1;
int b = 2;

std:thread r ([=](){doIt (a, b); return 1;});

当仅调用单个函数时,juanchopanza 答案可能会更有效,因为不会创建新函数。

lambda 版本允许您配置更多。假设您正在启动线程,这些线程最终调用 3 个函数中的 2 个函数。 juanchopanza 方法需要为每个排列命名函数。

目前,我认为这两种方法的区别主要是品味问题。

当您想了解有关 lambda 函数的更多信息时

什么是 C++11 中的 lambda 表达式?

于 2012-05-07T18:19:15.067 回答