Confusion:decltype vs std :: function

问题描述 投票:0回答:1

我对以下符号感到困惑。我想创建一个队列,其中包含函数回调。我认为这可以通过以下方式完成:

    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实际上是模板类,但在queuepackaged_task中使用的方式不应该相同吗?

c++ decltype std-function
1个回答
2
投票

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

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)>>无效(实际上未定义),因此不可用。

© www.soinside.com 2019 - 2024. All rights reserved.