c++11线程,静态或非静态类成员函数,参数的含义
c++11 thread, static or non-static class member function, meaning of arguments
我一直在玩c++11线程一段时间,并有一些问题。人们说,当你在线程中调用一个类成员函数时,这个函数必须是static
。但事实似乎并非如此。例如,我发现如下:
class bar
{ public:
void foo() {std::out << "Hello" << std::endl};
}
int main()
{
std::thread t0(&bar::foo, bar());
t0.join();
}
上面的代码运行良好。在c++11标准中,成员函数似乎不必是静态的。我想知道我的理解是否正确。另一个问题是,如果我简单地修改"void foo()"与"静态void foo()",我得到一个错误:
error: no type named 'type' in 'class std::result_of<void (*(bar))()>'
我不明白这一点,但似乎这是因为我调用线程的方式不正确。在线程中调用函数时我很困惑。例如,我找到了另一种方法来调用上面示例中的相同成员函数
int main()
{ bar A;
std::thread t0(&bar::foo, &A);
}
它也工作!我不知道这两种方式的区别。似乎在第一种方式中,类的构造函数将在每次调用foo()时执行,而在第二种方式中则不会。这是真的吗?此外,当在另一个类成员函数中调用成员函数时,必须传递'this'。
我上网搜索,我能找到的都是例子,没有解释论点的意义。谁能告诉我如何在std::thread
中设置参数(特别是前三个)?
std::thread t0(&bar::foo)
在静态foo
方法中工作得很好。
另外,当问一个问题时,考虑提供工作代码而不是你的文本你刚才在本网站的文本字段中实际写的内容。
简短的回答你的问题:提供this
参数非静态类方法或不提供它,如果它是静态类方法。
但是,如果你连这个都不明白,你必须知道一件事:每个类方法与this
对象一起工作,这意味着指向当前对象的常量指针。当绑定函数时(我猜确切的绑定工作在std::thread
内),第一个参数必须是您想要调用的方法的对象。否则它就没有意义了:那么你是在尝试用什么对象做某事呢?this
隐式地存在于类的每个非静态方法中,通过方法的第一个参数。
我建议你阅读权威的c++ stackoverflow图书指南和列表
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类