式テンプレートで使用できる配列ベースのコードがあるとします。たとえば、これらの配列をオーバーロードし、算術演算子などoperator[]
もオーバーロードしました。+
any_of
ここで、そのような配列でSTL アルゴリズムを実行したいと思います。簡単な方法は、
ExprArray<double, N> b, c; // init etc.
auto a = b + c; // for (auto i = 0; i < N; ++i) { a[i] = b[i] + c[i]; }
auto res = std::any_of(begin(a), end(a), SomePred{});
もちろん、私は計算を短絡して、変更された(範囲ベースの)ものを持っていることを望みlib::any_of
ます
// only compute b[i] + c[i] until SomePred is satisified
auto res = lib::any_of(b + c, SomePred{}); // write as explicit loop over b[i] + c[i]
オーバーlib::any_of
ロードoperator[]
された に対して行われたのと同じように、その入力に対して を記述すると、その仕事が行われoperator+
ます。ただし、これには、そのような配列で実行できる可能性のあるすべての STL アルゴリズムの同様の再実装が必要になります。
質問: それで、既存の範囲ベースのアルゴリズム (Boost.Range、range-v3)を、ExprArray iterators
. ExprArray
イテレータoperator*
を変更してoperator++
、これが範囲ベースのアルゴリズムに対して透過的になるようにすることは可能ですか?
// only compute b[i] + c[i] until SomePred is satisified
// needs to eventually dispatch to
// for (auto i = 0; i < N; ++i)
// if (SomePred(b[i] + c[i])) return true;
// return false;
auto res = ranges::any_of(b + c, SomePred{});
したがって、アルゴリズム バージョンが実際にイテレータに関して実装されている場合、ループは を計算するfor (auto it = first; it != last; ++it)
必要*it
があるという事実を認識し、 をb[i] + c[i]
実行する必要があることを認識++it
している必要があります++i
。