使用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()>也能运行过呢
...全文
221 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
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);

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧