跳到主要内容

C++ 命名要求: 可调用 (Callable)

一个 可调用 (Callable) 类型是指对于其 INVOKEINVOKE<R> 操作(例如由 std::functionstd::bindstd:🧵:thread 使用)适用的类型。

INVOKE 可以使用库函数 std::invoke 显式执行。 (自 C++17 起)
INVOKE<R> 可以使用库函数 std::invoke_r 显式执行。 (自 C++23 起)

要求

如果满足以下条件,则类型 T 满足 可调用 (Callable)
给定

  • f,一个类型为 T 的对象
  • ArgTypes,合适的参数类型列表
  • R,合适的返回类型

以下表达式必须有效

公有表达式要求
公有
INVOKE<R>(f,std::declval<ArgTypes>()...)
该表达式在未求值上下文中是合法的

备注

指向数据成员的指针可调用 (Callable) 的,即使没有发生函数调用。

标准库

此外,以下标准库设施接受任何 可调用 (Callable) 类型(不仅仅是 函数对象 (FunctionObject)

公有function(C++11)包装任何可复制构造类型的可调用对象,具有指定的函数调用签名
公有move_only_function(C++23)包装任何类型的可调用对象,具有指定的函数调用签名
公有bind(C++11)将一个或多个参数绑定到函数对象
公有bind_front(C++20)
bind_back(C++23)
按顺序将可变数量的参数绑定到函数对象
公有reference_wrapper(C++11)可复制构造 (CopyConstructible)可复制赋值 (CopyAssignable) 引用包装器
公有result_of(C++11) (C++20 中移除)
invoke_result(C++17)
推导使用一组参数调用可调用对象的返回类型
公有thread(C++11)管理一个单独的线程
公有jthread(C++20)支持自动加入和取消的 std::thread
公有call_once(C++11)即使从多个线程调用,也只调用一次函数
公有async(C++11)异步运行函数(可能在新线程中),并返回一个将保存结果的 std::future
公有packaged_task(C++11)封装一个函数以存储其返回值以供异步检索

C++ 命名要求: 可调用 (Callable)

一个 可调用 (Callable) 类型是指对于其 INVOKEINVOKE<R> 操作(例如由 std::functionstd::bindstd:🧵:thread 使用)适用的类型。

INVOKE 可以使用库函数 std::invoke 显式执行。 (自 C++17 起)
INVOKE<R> 可以使用库函数 std::invoke_r 显式执行。 (自 C++23 起)

要求

如果满足以下条件,则类型 T 满足 可调用 (Callable)
给定

  • f,一个类型为 T 的对象
  • ArgTypes,合适的参数类型列表
  • R,合适的返回类型

以下表达式必须有效

公有表达式要求
公有
INVOKE<R>(f,std::declval<ArgTypes>()...)
该表达式在未求值上下文中是合法的

备注

指向数据成员的指针可调用 (Callable) 的,即使没有发生函数调用。

标准库

此外,以下标准库设施接受任何 可调用 (Callable) 类型(不仅仅是 函数对象 (FunctionObject)

公有function(C++11)包装任何可复制构造类型的可调用对象,具有指定的函数调用签名
公有move_only_function(C++23)包装任何类型的可调用对象,具有指定的函数调用签名
公有bind(C++11)将一个或多个参数绑定到函数对象
公有bind_front(C++20)
bind_back(C++23)
按顺序将可变数量的参数绑定到函数对象
公有reference_wrapper(C++11)可复制构造 (CopyConstructible)可复制赋值 (CopyAssignable) 引用包装器
公有result_of(C++11) (C++20 中移除)
invoke_result(C++17)
推导使用一组参数调用可调用对象的返回类型
公有thread(C++11)管理一个单独的线程
公有jthread(C++20)支持自动加入和取消的 std::thread
公有call_once(C++11)即使从多个线程调用,也只调用一次函数
公有async(C++11)异步运行函数(可能在新线程中),并返回一个将保存结果的 std::future
公有packaged_task(C++11)封装一个函数以存储其返回值以供异步检索