Очевидно, что, как отметили другие пользователи, это сложная проблема, поэтому, к сожалению, это было долгое время, и в стандартной библиотеке все еще нет решения. Тем не менее, существуют уже имеющиеся библиотеки библиотек, такие как Boost :: Range и один в библиотечных библиотеках Adobe, которые обеспечивают не только простоту интерфейса, который вы описываете в своем вопросе, но и некоторые особенности fancier.
Ваш пример отлично работает с Boost (мы using namespace boost::range::adaptors
ниже):
boost::for_each(myVector, doSomething);
Мы также можем быстро и легко срезать myVector
:
boost::for_each(myVector | sliced(10, 20), doSomething)
Мы можем даже zip myVector
с другим, фильтровать по предикату и пробовать каждый другой элемент результирующих пар в одном простом заявлении (для этого требуется, чтобы вы распаковывали в doSomethingElse кортежи, созданные boost::combined
):
boost::for_each(
boost::combined(myVector, myOtherVector) | strided(2), doSomethingElse)