c++11多线程使用类的问题
两个问题。。。classA{....inta;voidfun(){...}}Af;std::threadt1(std::mem_fn(&A::fun),&f);//#1s...
两个问题。。。
class A{
....
int a;
void fun(){...}
}
A f;
std::thread t1(std::mem_fn(& A::fun),&f); // #1
std::thread t1(std::mem_fn(& A::fun), f); // #2
第一个问题, A::fun 之前的& 为什么需要? fun是个函数那么没有&不是一样传递地址吗....
第二个问题,f之前加了&和不加都可以运行.... thread是不是重载了thread()让他既可以接受指针也可以值传递?还是说使用了<template>
谢谢 展开
class A{
....
int a;
void fun(){...}
}
A f;
std::thread t1(std::mem_fn(& A::fun),&f); // #1
std::thread t1(std::mem_fn(& A::fun), f); // #2
第一个问题, A::fun 之前的& 为什么需要? fun是个函数那么没有&不是一样传递地址吗....
第二个问题,f之前加了&和不加都可以运行.... thread是不是重载了thread()让他既可以接受指针也可以值传递?还是说使用了<template>
谢谢 展开
1个回答
展开全部
fun不是函数,是“成员函数”,准确地说,是“非静态成员函数”,“非静态成员函数”和“函数”的使用方法完全不同
这里是 std::mem_fn 的功劳,std::mem_fn(& A::fun) 返回的可调用对象可以接受 A 类的对象作为参数,也可以接受 A* 类的指针作为参数
不过 std::thread 确实也有相关的(复杂)处理,使得
std::thread t1(& A::fun,&f); // #3
std::thread t1(& A::fun, f); // #4
也都是合法的。
追问
1.能不能稍微再详细一点.... 成员函数的地址跟一般函数有什么不一样... 谢谢
追答
成员函数跟一般函数完全不一样
成员函数指针跟一般的函数指针也完全不一样,不论是类型还是使用方式,在大多数编译器上甚至连 sizeof 的结果都不一样
真要具体说的话
class A{
public:
void fun();
};
void f();
void g(const A& ap);
auto p1 = &A::fun; // p1的类型是 void A::* ()
auto p2 = &f; // p2的类型是 void ()
auto p3 = &g; // p3的类型是 void (const A&)
// 以上是类型的不同
A aa;
(aa.*p1)(); // 调用p1,括号不能省
p2();
p3(aa);
// 以上是使用方式的不同
std::cout<<sizeof(p1)<<' '<<sizeof(p2)<<' '<<sizeof(p3);
// 在某个平台上输出 16 8 8
显然,看起来就完全不同
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询