C++ 具名要求:可调用 (Callable)
来自cppreference.com
可调用 (Callable) 类型是可应用 INVOKE 和 INVOKE<R> 操作(例如用于 std::function、std::bind 和 std::thread::thread)的类型。
库函数 std::invoke 可以显式执行 |
(C++17 起) |
库函数 std::invoke_r 可以显式执行 |
(C++23 起) |
要求
如果满足下列条件,那么类型 T
是可调用 (Callable) 的:
给定
-
T
类型的对象f
- 适合的实参类型列表
ArgTypes
- 适合的返回类型
R
那么下列表达式必须合法:
表达式 | 要求 |
---|---|
INVOKE<R>(f, std::declval<ArgTypes>()...) | 该表达式在不求值语境中良构 |
注解
数据成员指针是可调用 (Callable) 的,尽管实际上并不发生函数调用。
标准库
此外,下列标准库设施接受任何可调用 (Callable) 类型(不仅是函数对象 (FunctionObject) ):
(C++11) |
任意可复制构造的可调用对象的可复制包装 (类模板) |
(C++23) |
任意可调用对象的仅移动包装,支持给定调用签名中的限定符 (类模板) |
(C++26) |
任意可复制构造的可调用对象的可复制包装,支持给定调用签名中的限定符 (类模板) |
(C++26) |
任意可调用对象的无所有权包装 (类模板) |
(C++11) |
绑定一或多个实参到函数对象 (函数模板) |
(C++20)(C++23) |
按顺序绑定一定数量的实参到函数对象 (函数模板) |
(C++11) |
可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 的引用包装器 (类模板) |
(C++11)(C++20 中移除)(C++17) |
推导以一组实参调用一个可调用对象的结果类型 (类模板) |
(C++11) |
管理单独的线程 (类) |
(C++20) |
支持自动合并和取消的 std::thread (类) |
(C++11) |
仅调用函数一次,即使从多个线程调用 (函数模板) |
(C++11) |
异步运行一个函数(有可能在新线程中执行),并返回将保有它的结果的 std::future (函数模板) |
(C++11) |
打包一个函数,存储其返回值以进行异步获取 (类模板) |
参阅
检查类型能否以给定的实参类型调用(如同以 std::invoke) (类模板) | |
(C++20) |
指定能以给定的一组实参类型调用的可调用类型 (概念) |
(C++17)(C++23) |
以给定实参和可能指定的返回类型 (C++23 起)调用任意可调用 (Callable) 对象 (函数模板) |