名稱空間
變體
操作

std::experimental::not_fn

來自 cppreference.com
< cpp‎ | 實驗性
定義於標頭檔案 <experimental/functional>
模板< F>
/*未指定*/ not_fn( F&& f );
(庫基礎 TS v2)

建立一個轉發呼叫包裝器,它返回其所持有的可呼叫物件的補集。

目錄

[編輯] 引數

f - 用於構造包裝器所持有的 可呼叫 物件的物件

[編輯] 返回值

FDstd::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::not1std::not2

[編輯] 另請參見

(C++17)
建立函式物件,該物件返回其所持函式物件結果的補數
(函式模板) [編輯]