使用std::packaged_task的一个疑问

wwyyxx26 2017-11-28 01:04:28
我测试了一下std::packaged_task
class A
{
public:
int DoSomethingA(int i, int j, int n)
{
printf("DoSomething %d, %d, %d\n", i, j, n);
return 0;
}
};


std::packaged_task<void()> tska(std::bind(&A::DoSomethingA, &a, 3, 4, 5));


tska();

这里std::packaged_task定义的模版是void(),能编译过,tska()也执行成功,返回
DoSomething 3, 4, 5

这里我有一个疑问,我用bind传入的是一个3个参数的函数DoSomethingA,这里应该定义std::packaged_task<int(int,int,int)>才对吧?
为什么定义为std::packaged_task<void()>也能运行过呢
...全文
156 2 点赞 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tylk520 2019-01-05
引用 1 楼 Jinhao 的回复:
>这里我有一个疑问,我用bind传入的是一个3个参数的函数DoSomethingA,这里应该定义std::packaged_task<int(int,int,int)>才对吧? std::bind(&A::DoSomethingA, &a, 3, 4, 5); 绑定了对象a和参数3,4,5。返回一个返回值类型为int,无参的可调用对象。 auto fn = std::bind(&A::DoSomethingA, &a, 3, 4, 5); int r = fn(); //此时。等同于 int r = a.DoSomethingA(3,4,5); 由于std::bind返回的是无参的。因此不能定义std::packaged_task<int(int,int,int)> >为什么定义为std::packaged_task<void()>也能运行过呢 标准库中的可调用wrapper类型,例如std::function, std::packaged_task,都是引用一个实际的调用对象,称为callable target, 例如你的代码中 packaged_task的 callable target就是 std::bind返回的 可调用对象。这些wrapper的函数签名类型 不必和 callable target的函数签名类型一致。只要其返回值和参数的类型能隐式转换也可以。 例如你的例子中,DoSomethingA的返回值类型是 int,可以转换成 packaged_task中的void。 int foo(std::string); std::function<void(const char*)> fn(foo);
为什么 packaged_task<int(int,int,int)> task(&A::DoSomethingA) 不行呢,如何把this指针传进去呢
  • 打赏
  • 举报
回复
Jinhao 2017-11-29
>这里我有一个疑问,我用bind传入的是一个3个参数的函数DoSomethingA,这里应该定义std::packaged_task<int(int,int,int)>才对吧? std::bind(&A::DoSomethingA, &a, 3, 4, 5); 绑定了对象a和参数3,4,5。返回一个返回值类型为int,无参的可调用对象。 auto fn = std::bind(&A::DoSomethingA, &a, 3, 4, 5); int r = fn(); //此时。等同于 int r = a.DoSomethingA(3,4,5); 由于std::bind返回的是无参的。因此不能定义std::packaged_task<int(int,int,int)> >为什么定义为std::packaged_task<void()>也能运行过呢 标准库中的可调用wrapper类型,例如std::function, std::packaged_task,都是引用一个实际的调用对象,称为callable target, 例如你的代码中 packaged_task的 callable target就是 std::bind返回的 可调用对象。这些wrapper的函数签名类型 不必和 callable target的函数签名类型一致。只要其返回值和参数的类型能隐式转换也可以。 例如你的例子中,DoSomethingA的返回值类型是 int,可以转换成 packaged_task中的void。 int foo(std::string); std::function<void(const char*)> fn(foo);
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2017-11-28 01:04
社区公告
暂无公告