いくつかの異なる ref 修飾された、または単に const 修飾された のオーバーロードを含むファンクターがあるとしますoperator ()
。STLアルゴリズムを使用するさまざまなコンテキストで、さまざまなものを呼び出す必要があります。つまり、operator ()
STLアルゴリズムに提供するファンクター値/参照のconstnessまたは「lvalue/rvalue-ness」に依存して呼び出される適切なオーバーロードが必要です。たとえば、仮説アルゴリズムがありますrecurrent_all_of
。STL で見つかる可能性があるフォームは次のとおりです。
template< typename Iterator, typename BinaryFunctor >
bool
recurrent_all_of(Iterator begin, Iterator end, BinaryFunctor functor)
{
if (begin == end) {
return false;
}
Iterator previous = begin;
while (++begin != end) {
if (!functor(*previous, *begin)) {
return false;
}
previous = begin;
}
return (++previous != end);
}
しかし、参照しやすいという主張を満たすには、フォームは次のようにする必要があります。
template< typename Iterator, typename BinaryFunctor >
bool
recurrent_all_of(Iterator begin, Iterator end, BinaryFunctor && functor)
{
if (begin == end) {
return false;
}
Iterator previous = begin;
while (++begin != end) {
if (!std::forward< BinaryFunctor >(functor)(*previous, *begin)) {
return false;
}
previous = begin;
}
return (++previous != end);
}
誤解はありますか?STL アルゴリズムがそのように設計されていないのはなぜですか?