variadic-templateによるタプル

前回、関数を実装したので今回はクラスを実装してみるテスト。
作り方は関数同様に再帰的に作るっぽいのでその通りやってみました。

template< class... D > class Tuple;

template<>
class Tuple<>{};

template< class D, class... DS >
class Tuple< D, DS... >
{
public:
	D data;
	Tuple< DS... > datas;
};

見ての通り、最低限の実装しかしてません。
作ってみて思ったのだがどうも宣言の順番がわからん。とりあえずプロトタイプ宣言しておけば無難っぽいが・・・。テンプレートの特殊化のつもりで一般型→特殊型と書いたらだめだった様な気がした。どうもhaskellのテンプレートマッチングのように特殊型→一般型の法が正しいような気がする。もうちょっと勉強が必要だな。

で、ついでにget関数作ろうと思ったのですが・・・挫折しましたorz。最初に思ったのが「戻り値の型ってどうすればいいの?」でした。調べたら戻り値の型を得る為にresult_ofとかdecltypeとかあるみたいだがどちらを使っても上手く出来なかった。

template< class Arg, class... Args >
Arg& get< 0 >( Tuple< Arg, Args... >& arg ){
	return arg.data;
};

template< int D, class... Args >
auto get( Tuple< Args... >& arg ) -> decltype( get< D-1 >( arg.datas ) ){
	return get< D-1 >( arg.datas );
};

これだと「getなんてものは宣言されてないぜ」と叱られてしまう。プロトタイプ宣言すればよいのか?でもそのときの戻り値は?
どうやら私にはまだ無理っぽいです。もうちょっと勉強してきます。