Yak!の日記: Variadic な std::tuple に対する Fusion アダプタ書いてみた
きっと誰かやってるだろうと思いつつ書いてみたら案の定 @iorate さんが直近で同様の事をやっているわけだが折角なので晒してみる。
https://gist.github.com/1000596
動作確認したのは g++ 4.3.4 と g++ 4.6.0。VC10 は Variadic templates が使えないのでパス。@iorate さんのを見ればどこ直せば対応できるかは分かるけど。違いとしては一応 CV 修飾子(要素の型だけでなく tuple 自体についてる場合についても)と参照型について手当をしているけど、参照型については C++0x で reference to reference が大丈夫になったので何も考えずに tuple_element<I, tuple_type> & で大丈夫かもしれない(左辺値参照の範囲では)。
こういうのを自分で書いてみるというのもやっぱり勉強になって、型のテスト用に MPL 使ったけどメタ関数周りが色々と理解が足りなかったのを再認識した。さらに基本中の基本だろうけど、const tuple<int&> な t があったとして get<0>(t) の型は const int& ではなく int& だというのも再認識。
int n;
struct A {
int &r;
int *p;
};
const A a = { n, &n };
が有った時に a.r = 5; が可能というのと同じで、一瞬あれ?っと思うのだが *(a.p) = 5; が可能であることと同じである。つまり、ポインタ自体が const なのであって指している先が const ではない。参照は指し先が変えられないので最初から const みたいなものではあるが。
Variadic な std::tuple に対する Fusion アダプタ書いてみた More ログイン