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

履歴 編集

concept
<concepts>

std::predicate(C++20)

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

処理系

関連項目

参照