• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    concept
    <concepts>

    std::predicate

    namespace std {
      template<class F, class... Args>
      concept predicate =
        regular_invocable<F, Args...> && boolean-testable<invoke_result_t<F, Args...>>;
    }
    

    概要

    predicateは、任意の関数呼び出し可能な型Fが引数Args...によって関数呼び出し可能(regular_invocable)であり、その戻り値型がboolに変換可能であることを表すコンセプトである。

    predicateのモデルとなるFはその引数Args...に対しての述語(predicate)と呼ばれ、(<algorithm>の関数などにおいて)引数がある条件を満たしているかを判定するものとして利用される。

    #include <iostream>
    #include <concepts>
    #include <random>
    
    template<typename F, typename... Args>
    requires std::predicate<F, Args...>
    void f(const char* name) {
      std::cout << name << " is predicate" << std::endl;
    }
    
    template<typename F, typename... Args>
    void f(const char* name) {
      std::cout << name << " is not predicate" << std::endl;
    }
    
    
    bool func1(int);
    int  func2(int);
    int* func3(int);
    auto lambda = [](auto a) { return a < 10; };
    
    struct predicate {
      bool operator()(int n) const {
        return n < 10;
      }
    };
    
    struct not_predicate {
      void operator()(int) {
      }
    };
    
    
    int main() {
      f<decltype(func1), int>("func1(int)");
      f<decltype(func2), int>("func2(int)");
      f<decltype(func3), int>("func3(int)");
      f<decltype(lambda), int>("lambda(int)");
      f<std::mt19937>("std::mt19937()");
      f<predicate, int>("predicate(int)");
    
    
      std::cout << "\n";
      f<not_predicate, int>("not_predicate(int)");
    }
    

    出力

    func1(int) is predicate
    func2(int) is predicate
    func3(int) is predicate
    lambda(int) is predicate
    std::mt19937() is predicate
    predicate(int) is predicate
    
    not_predicate(int) is not predicate
    

    バージョン

    言語

    • C++20

    処理系

    関連項目

    参照