Confusion: decltype vs 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
编译会产生不同的结果。现在CCD_ 5给出了CCD_ 6。其他初始化方式也可以。
我的问题:
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
期望签名,
所以CCD_ 19和CCD_
std::function<int(int)>
是一种类型,而不是签名,因此std::packaged_task<std::function<int(int)>>
是无效的(实际上没有定义(,因此不可用。
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何在向量中删除 std::function<void()>?
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将 lambda 表达式传递给 std::function in C++
- 广义 std::function (std::any 表示可调用对象)
- std::function<std::optional<T>()> 如何与返回 T 的 lambda 兼容?
- std::function std::bind with lambda overload ambiguity
- Clang bug with std::function, std::bind and std::ref?
- 为什么我会收到编译错误"use of deleted function 'std::unique_ptr ..."
- 为什么我不能让 std::function<std::vector<T>::iterator> 绑定到返回该类型的 lambda?
- 回调(std::function/std::bind)与接口(抽象类)的优缺点