Files
cppdraft_translate/cppdraft/indirectcallable.md
2025-10-25 03:02:53 +03:00

10 KiB

[indirectcallable]

24 Iterators library [iterators]

24.3 Iterator requirements [iterator.requirements]

24.3.6 Indirect callable requirements [indirectcallable]

24.3.6.1 General [indirectcallable.general]

1

#

There are several concepts that group requirements of algorithms that take callable objects ([func.def]) as arguments.

24.3.6.2 Indirect callable traits [indirectcallable.traits]

1

#

To implement algorithms taking projections, it is necessary to determine the projected type of an iterator's value type.

For the exposition-only alias template indirect-value-t,indirect-value-t denotes

invoke_result_t<Proj&, indirect-value-t> if T names projected<I, Proj>, and

iter_value_t& otherwise.

24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]

1

#

The indirect callable concepts are used to constrain those algorithms that accept callable objects ([func.def]) as arguments.

namespace std {template<class F, class I>concept indirectly_unary_invocable =indirectly_readable &&copy_constructible &&invocable<F&, indirect-value-t> &&invocable<F&, iter_reference_t> &&common_reference_with< invoke_result_t<F&, indirect-value-t>, invoke_result_t<F&, iter_reference_t>>; template<class F, class I>concept indirectly_regular_unary_invocable =indirectly_readable &&copy_constructible &&regular_invocable<F&, indirect-value-t> &&regular_invocable<F&, iter_reference_t> &&common_reference_with< invoke_result_t<F&, indirect-value-t>, invoke_result_t<F&, iter_reference_t>>; template<class F, class I>concept indirect_unary_predicate =indirectly_readable &&copy_constructible &&predicate<F&, indirect-value-t> &&predicate<F&, iter_reference_t>; template<class F, class I1, class I2>concept indirect_binary_predicate =indirectly_readable && indirectly_readable &&copy_constructible &&predicate<F&, indirect-value-t, indirect-value-t> &&predicate<F&, indirect-value-t, iter_reference_t> &&predicate<F&, iter_reference_t, indirect-value-t> &&predicate<F&, iter_reference_t, iter_reference_t>; template<class F, class I1, class I2 = I1>concept indirect_equivalence_relation =indirectly_readable && indirectly_readable &&copy_constructible &&equivalence_relation<F&, indirect-value-t, indirect-value-t> &&equivalence_relation<F&, indirect-value-t, iter_reference_t> &&equivalence_relation<F&, iter_reference_t, indirect-value-t> &&equivalence_relation<F&, iter_reference_t, iter_reference_t>; template<class F, class I1, class I2 = I1>concept indirect_strict_weak_order =indirectly_readable && indirectly_readable &&copy_constructible &&strict_weak_order<F&, indirect-value-t, indirect-value-t> &&strict_weak_order<F&, indirect-value-t, iter_reference_t> &&strict_weak_order<F&, iter_reference_t, indirect-value-t> &&strict_weak_order<F&, iter_reference_t, iter_reference_t>;}

24.3.6.4 Alias template projected [projected]

1

#

Alias template projected is used to constrain algorithms that accept callable objects and projections ([defns.projection]).

It combines an indirectly_readable type I and a callable object type Proj into a new indirectly_readable type whose reference type is the result of applyingProj to the iter_reference_t of I.

🔗

namespace std {template<class I, class Proj>struct projected-impl { // exposition onlystruct type { // exposition onlyusing value_type = remove_cvref_t<indirect_result_t<Proj&, I>>; using difference_type = iter_difference_t; // present only if I// models weakly_incrementable indirect_result_t<Proj&, I> operator*() const; // not defined}; }; template<indirectly_readable I, indirectly_regular_unary_invocable Proj>using projected = projected-impl<I, Proj>::type;}