Confusion: decltype vs std::function

Confusion: decltype vs std::function

本文关键字:function std decltype Confusion vs      更新时间:2023-10-16

我对以下符号有点困惑。我想创建一个队列,用于保存函数回调。我认为这可以通过以下方式完成:

int fun(int);
[...]
std::queue<std::function<int(int)>> q0;
std::queue<decltype(fun)> q1;
std::queue<int (int)> q2;

完整代码https://onlinegdb.com/rkvAdPpmU

遗憾的是,不允许使用decltype<fun>int (int)。老实说,我更喜欢std::function的方式。现在是下一部分。。。

我最近想出了一个叫packaged_task的东西。我尝试以与队列相同的方式定义模板:

int fib(int);
[...]
std::packaged_task<int (int)> f0(fib);
std::packaged_task<decltype(fib)> f1(&fib);
std::packaged_task<std::function<int(int)>> f2(&fib);

完整代码https://www.onlinegdb.com/B17iYvaQL

编译会产生不同的结果。现在CCD_ 5给出了CCD_ 6。其他初始化方式也可以。

我的问题:

1(int (int)等价于decltype(fib)吗,其中int fib(int)

2( 虽然我知道std::function实际上是一个模板类,但它在queuepackaged_task中的使用方式不应该相同吗?

不能存储函数,但可以存储函数指针:

std::queue<decltype(&fun)> q1;
std::queue<int (*)(int)> q2;

演示

  • decltype(fun)就是int (int)
  • decltype(&fun)就是int (*)(int)

std::packaged_task,因为std::function期望签名,

所以CCD_ 19和CCD_

std::function<int(int)>是一种类型,而不是签名,因此std::packaged_task<std::function<int(int)>>是无效的(实际上没有定义(,因此不可用。