困惑: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,但它不应该在 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)>>
是无效的(实际上没有定义),所以不可用。
我对以下符号有点困惑。我想创建一个队列,用于保存函数回调。我认为这可以通过以下方式完成:
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,但它不应该在 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)>>
是无效的(实际上没有定义),所以不可用。