Mam funkcję, która musi wielokrotnie wyliczyć iterator, ale according to MSDN, "Po zwiększeniu dowolnej kopii iteratora wejściowego, żadna inna kopia nie może być bezpiecznie porównywana, dereferencyjna lub zwiększana po tym czasie."Jak ograniczyć iterator do bycia przyszłym iteratorem?
Aby to ułatwić, zamiast tworzyć oddzielną implementację dla nie-forward-iteratorów, które kopiują dane i wyliczają kopię, chcę ograniczyć moją metodę tylko do przyjmowania kolejnych iteratorów, i odrzucając statycznie iteratory wejściowe .
Teraz mam coś takiego:
template<typename It, typename TCallback /*signature: bool(value_type)*/>
bool EnumerateTwice(const It &begin, const It &end, TCallback callback)
{
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
return true;
}
ale nic nie ogranicza It
do bycia naprzód iterator.
Jak umieścić to ograniczenie na funkcji szablonowej? (C++ 03)
+1 Oooooo nie wiedział, że iteratory są oznaczone tagami! To bardzo przydatne. Wielkie dzięki! :) – Mehrdad
Spowoduje to odrzucenie iteratorów dwukierunkowych i losowych. Użyj 'is_base_of' zamiast' is_same' dla właściwej semantyki. – ildjarn
@ildjarn: O tak, dobry punkt; dzięki! – Mehrdad