std::experimental::not_fn
來自 cppreference.com
定義於標頭檔案 <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) |
建立函式物件,該物件返回其所持函式物件結果的補數 (函式模板) |