std::experimental::not_fn
来自 cppreference.com
< cpp | experimental
定义在头文件 <experimental/functional> 中 |
||
template< class F> /*未指定*/ not_fn( F&& f ); |
(库基础 TS v2) | |
创建一个转发调用包装器,它返回其持有的可调用对象的补码。
内容 |
[编辑] 参数
f | - | 用于构造包装器持有的 Callable 对象的对象 |
[编辑] 返回值
设 FD
为 std::decay_t<F>,并且 fd
为从 std::forward<F>(f) 构造的类型为 FD
的左值。
not_fn
返回一个转发调用包装器 fn
,其类型未指定,使得 fn(a1, a2, ..., aN) 等同于 !INVOKE(fd, a1, ..., aN),其中 INVOKE
是 Callable 中描述的操作。
返回的调用包装器始终是 MoveConstructible,并且如果 FD 是 CopyConstructible,则它是 CopyConstructible。
[编辑] 备注
如果 fd
不是 Callable,或者 std::is_constructible<FD, F>::value 不是 true
,则行为未定义。
[编辑] 异常
不抛出异常,除非 fd
的构造抛出异常。
[编辑] 可能的实现
namespace detail { template<class F> struct not_fn_t { F f; template<class... Args> auto operator()(Args&&... args) noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } // cv-qualified overload for QoI template<class... Args> auto operator()(Args&&... args) const noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } template<class... Args> auto operator()(Args&&... args) volatile noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } template<class... Args> auto operator()(Args&&... args) const volatile noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } }; } template<class F> detail::not_fn_t<std::decay_t<F>> not_fn(F&& f) { return { std::forward<F>(f) }; } |
[编辑] 注释
not_fn
旨在替换 C++03 时代的否定符 std::not1 和 std::not2。
[编辑] 另请参阅
(C++17) |
创建一个函数对象,返回其持有的函数对象的返回值的补码 (函数模板) |