std::experimental::not_fn
来自 cppreference.cn
定义于头文件 <experimental/functional> |
||
模板< 类 F> /*未指定*/ not_fn( F&& f ); |
(库基础 TS v2) | |
创建一个转发调用包装器,它返回其所持有的可调用对象的补集。
目录 |
[编辑] 参数
f | - | 用于构造包装器所持有的 可调用 对象的对象 |
[编辑] 返回值
令 FD
为 std::decay_t<F>,fd
为从 std::forward<F>(f) 构造的 FD
类型的左值。
not_fn
返回一个未指定类型的转发调用包装器 fn
,使得 fn(a1, a2, ..., aN) 等价于 !INVOKE(fd, a1, ..., aN),其中 INVOKE
是 可调用 中描述的操作。
返回的调用包装器始终是 可移动构造 的,如果 FD 是 可复制构造 的,则它是 可复制构造 的。
[编辑] 备注
如果 fd
不是 可调用 的,或者 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) |
创建函数对象,该对象返回其所持函数对象结果的补数 (函数模板) |