C++のrange-based forで複数のコンテナをイテレーションする

C++は健康に良い。C++11で導入されたrange-based forが腱鞘炎の治療に役立つことは世界のどこに行っても変わらない普遍的な事実だ。だが、関節に優しいC++のrange-based forでも出来ないことがある。複数のコンテナのイテレーションだ。これだけは素直にwhile文を書いた方が楽に書ける。

using std::begin, std::end;
int a1[] = {1, 2, 3};
int a2[] = {3, 2, 1};
// while
{
    auto b1 = begin(a1);
    auto b2 = begin(a2);
    while(b1 != end(a1) && b2 != end(a2)) { /* hoge hoge */ ++b1; ++b2; }
}
// range-based for
{
    auto b = begin(a2);
    for(auto&& i1 : a1) {
        auto&& i2 = *b++;
        { /* hoge hoge */ }
    }
}

でも僕だって腱鞘炎は嫌だし、どうせならrange-based forで短いコードを書きたい。そのほうが意図が伝わりやすいからだ。以下のように書くことができれば全人類の腱鞘炎は悉く完治してC++erから新しい腱鞘炎患者が生まれることはないだろう。

int a1[] = {1, 2, 3};
int a2[] = {3, 2, 1};
for(auto[i1, i2] : hoge{a1, a2}) { /* hoge hoge */ }

そういうわけで作った。

github.com

これはコンテナか配列の要素数さえ等しければ如何なるコンテナや配列でも同時にイテレーションできる。

std::vector<int> v1{ 1, 2, 3 };
int v2[] = { 3, 2, 1 };

for (auto [i1, i2] : ouchi::multiitr{ v1, v2 }) {
    assert(i1 + i2 == 4);
}

大学の演習課題を解いている時にあったら便利だなぁと思って今作っただけで、本当は腱鞘炎はどうでもいいし私は腱鞘炎ではない。

wandbox.org