一応、前回の記事から続いています。
int values[2][3]
という組み込みの多次元配列と同等の構造を std::array
を使って定義すると、 std::array<std::array<int, 3>, 2>
となります。
T values[A][B][C][D]
ならば std::array<std::array<std::array<std::array<T, D>, C>, B>, A>
です。
要素数の順序が逆になってわかりにくいですし、そもそも長ったらしくてとても書きたくないですね。
そこで、上記のような多次元配列を multi_array<int, 2, 3>
や multi_array<T, A, B, C, D>
といった書き方で定義できるようにしてみました。
VC++2013でもコンパイルできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| - - | | | | ! | | - - ! ! | - | | | ! | | - - ! ! | - | | | | ! | | ! |
|
この multi_array
は次のようなコードで初期化できます。
|
要素数を推論させて初期化するには、前回の記事でも使った make_array
関数を入れ子にして…と言いたいところなのですが、型の指定が面倒になります。
そこで、引数から要素数だけでなく型も推論する1次元配列作成関数を定義します。
Sproutというライブラリ*1の make_common_array
関数の実装がとても参考になります。*2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| - - ! | - | | | | | ! | - | | | | ! | | - | ! ! |
|
VC++2013でもコンパイルできるようにしてあります。
VC++対応が不要ならば constexpr
関数にするのもいいでしょう。
上記の make_common_array
関数を使うと、次のように型も要素数も自動推論させて1次元配列や多次元配列を初期化できます。
|
もっと実用性を高めるには、多次元配列に対応したユーティリティ関数を色々作った方がいいでしょうね。