経度のように周期的なデータが長さn配列xに格納されているとする。添字が0から始まるとして,x[n]x[0]x[-1]x[n-1]の値を返すようにしたい。[]の定義は後回しにして,今回は関数を書いてみる。

C++でtemplateを使っておけば,特定の型に依存しないようにするジェネリックプログラミングだと思っていた。しかしC由来の普通の配列には使えない。そもそもコンテナを渡したり,返したりすると,一般性や効率が損なわれるのでご法度とのこと。

反復子を渡すようにして,負でもコンテナのサイズより大きくても良い添字iでの値を返すジェネリックな関数を書いてみた。

https://gist.github.com/tenomoto/79f5fb60783d24dcb8bf7910da4052c6

ある値以上になる添字を返す関数は,次のように書いたらよさそうだ。

https://gist.github.com/tenomoto/17ff04f4a1445302bb19a439c8c2546b

反復子として,ベクトルはx.cbegin()x.cend()があるが,valarrayにはないのでstd::begin(x)std::end(x)を使う。配列はポインタ演算xx + nnは配列の長さ)でよい。