我对以下符号感到困惑。我想创建一个队列,其中包含函数回调。我认为这可以通过以下方式完成:
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
实际上是模板类,但在queue
和packaged_task
中使用的方式不应该相同吗?
您不能存储函数,但是可以存储函数指针:
std::queue<decltype(&fun)> q1;
std::queue<int (*)(int)> q2;
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)>>
无效(实际上未定义),因此不可用。