困惑:decltype 与 std::function

Confusion: decltype vs std::function

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

    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

编译产生不同的结果。现在 std::function 给了 error: variable ‘std::packaged_task<std::function<int(int)> > f2’ has initializer but incomplete type。其他初始化方式都可以。

我的问题:

1) int (int)是否等同于decltype(fib),其中int fib(int)?

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

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

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

Demo

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

std::packaged_task 因为 std::function 需要签名,

所以 std::packaged_task<int(int)>std::packaged_task<decltype(fib)> 都可以。

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