C++ 具名要求: Callable

来自cppreference.com
< cpp‎ | named req
 
 
 

可调用 (Callable) 类型是可应用 INVOKE 操作(例如用于 std::functionstd::bind ,及 std::thread::thread)的类型。此操作可以用库函数 std::invoke 显式进行。 (C++17 起)

目录

[编辑] 要求

若满足下列条件,则类型 T 满足可调用 (Callable)

给定

  • fT 类型的对象
  • ArgTypes ,适合的参数类型列表
  • R, 适合的返回类型

则下列表达式必须合法:

表达式 要求
INVOKE<R>(f, std::declval<ArgTypes>()...) 该表达式在不求值语境中为良式

其中 INVOKE<R>(f, t1, t2, ..., tN) 定义为R 是可有 cv 限定的 void ,则为 static_cast<void>(INVOKE(f, t1, t2, ..., tN)) ,否则为 (C++17 起) INVOKE(f, t1, t2, ..., tN)隐式转换R

其中 INVOKE(f, t1, t2, ..., tN) 定义如下:

  • 则若 std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::valuetrue ,则 INVOKE(f, t1, t2, ..., tN) 等价于 (t1.*f)(t2, ..., tN)
  • 否则,若 std::remove_cvref_t<decltype(t1)>std::reference_wrapper 的特化,则 INVOKE(f, t1, t2, ..., tN) 等价于 (t1.get().*f)(t2, ..., tN) (C++17 起)
  • 否则,若 t1 不满足前述条件,则 INVOKE(f, t1, t2, ..., tN) 等价于 ((*t1).*f)(t2, ..., tN)
  • 则若 std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::valuetrue ,则 INVOKE(f, t1) 等价于 t1.*f
  • 否则,若 std::remove_cvref_t<decltype(t1)>std::reference_wrapper 的特化,则 INVOKE(f, t1) 等价于 t1.get().*f (C++17 起)
  • 否则,若 t1 不满足前述条件,则 INVOKE(f, t1) 等价于 (*t1).*f
  • 否则, INVOKE(f, t1, t2, ..., tN) 等价于 f(t1, t2, ..., tN) (即 f 是一个函数对象 (FunctionObject) )

[编辑] 注意

对于指向成员函数的指针和指向数据成员的指针, t1 可以是一个常规指针或一个重载 operator* 的类,例如 std::unique_ptrstd::shared_ptr

指向数据成员的指针为可调用 (Callable) ,尽管不发生函数调用。

[编辑] 标准库

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

std::function
std::bind
std::result_of
std::thread::thread
std::call_once
std::async
std::packaged_task
std::reference_wrapper

[编辑] 参阅

检查类型能否被以指定参数类型调用(如同以 std::invoke
(类模板) [编辑]