std::indirect_binary_predicate
std::indirect_binary_predicate (간접 이항 술어 컨셉)
인자로 이항 술어를 호출하는 알고리즘에 대한 요구사항을 명세하는 컨셉이에요. std::predicate와 달리 I1·I2 자체가 아니라 그것들이 참조하는 타입에 적용돼요. C++20부터 있어요.
출처: cppreference
본문
<iterator> 헤더에 정의돼 있어요.
template< class F, class I1, class I2 >
concept indirect_binary_predicate =
std::indirectly_readable<I1> &&
std::indirectly_readable<I2> &&
std::copy_constructible<F> &&
std::predicate<F&, /*indirect-value-t*/<I1>, /*indirect-value-t*/<I2>> &&
std::predicate<F&, /*indirect-value-t*/<I1>, std::iter_reference_t<I2>> &&
std::predicate<F&, std::iter_reference_t<I1>, /*indirect-value-t*/<I2>> &&
std::predicate<F&, std::iter_reference_t<I1>, std::iter_reference_t<I2>>;
indirect_binary_predicate 컨셉은 인자로 이항 술어를 호출하는 알고리즘에 대한 요구사항을 명세해요. 이 컨셉과 std::predicate의 핵심 차이는 I1·I2 자체가 아니라 그것들이 참조하는 타입에 적용된다는 점이에요.
이 술어는 값·참조 타입의 네 가지 조합(값/값, 값/참조, 참조/값, 참조/참조) 모두에서 성립해야 해요. 그래서 std::reference_wrapper와 projection을 올바르게 처리할 수 있어요(P2609R3 수정).
예제
#include <iterator>
#include <vector>
#include <concepts>
#include <functional>
int main()
{
static_assert(std::indirect_binary_predicate<std::less<>>,
std::vector<int>::iterator, std::vector<int>::iterator>);
}