赞
踩
一个 Callable 类型是适用于 INVOKE (用于,e.g.,srtd::function, std::bind,和 std::thread::thread) 操作的类型。操作可能被显式的使用库函数std::invoke
执行。
类型T满足Callable
,如果有:
下列表达式必须合法:
INVOKE<R>(f, std::declval<ArgTypes>()...)
该表达式在未计算的上下文中,表达式良构。
如果 R 是 cv-qualified 的 void
,INVOKE<R>(f, t1, t2,…,tN) 被定义为 static_cast<void>(INVOKE(f, t1, t2,..., tN))
,否则,INVOKE<R>(f, t1, t2, … , tN) 将隐式转换为R。
INVOKE(f, t1, t2, …, tN) 的定义如下:
std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::value
为 true
,那么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)
(since C++17)INVOKE(f, t1, t2, ..., tN)
等价于((*t1).*f)(t2, ..., tN)
.std::if_base_of<T, std::remove_reference_t<decltype(t1)>>::value
为 true
,那么 INVOKE(f, t1)
等价于t1.*f
std::remove_cvref_t<decltype(t1)>
是std::reference_wrapper
的特化,那么INVOKE(f, t1)
等价于t1.get().*f
(since C++17)INVOKE(f, t1)
等价于 (*t1).*f
INVOKE(f, t1, t2, ..., tN)
等价于f(t1, t2, ..., tN)
(f 是一个FunctionObject
)对于成员函数指针和数据成员指针,t1 可能是一个常规的指针或是重载了 operator*
的类类型的对象,例如 std::unique_ptr 或 std::shared_ptr (等价于(*t1).*f(t2, ..., tN)
)。
数据成员的指针式 Callable
的,即使没有函数调用的发生。
另外,下列标准库工具接受任何Callable
类型(不仅仅式FunctionObject
)
CopyConstructible
和 CopyAssignable
引用封装器std::future
来保存结果 (function template)Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。