decltypeで取得した型内のネストした型を使う方法

hoge bar; // みたいな宣言がg++でコンパイル通らんことが分かったが、かと言って対処法があるわけではなし…
http://twitter.com/tanakh/statuses/4342143438

これを回避しようとして,decltypeで取得した型の内側で定義されている型に言及しようとすると,g++に怒られます.
ので,テンプレートを仲介してみたらあっさり通りました.*1多分work-aroundだと思うです.

これでC++0xの機能のみで目的が達成出来ました :-)

g++ 4.4.0で動作確認.

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;

template< typename T >
struct type_holder {
	typedef T type;
};

int main(){
	typedef vector<int> Vec;
	Vec v;

	//back_insert_iterator<Vec> bit = back_inserter(v);
	back_insert_iterator< decltype(v) > bit = back_inserter(v);

        // 重要!!
	vector<
		type_holder<decltype(v)>::type::value_type
	> v2;
	// vector< decltype(v)::type::value_type > v2; // Error ;(

        // 一応確認で…
	for(int i=0; i<5; i++){
		*bit = i;
	}
	copy(v.begin(), v.end(), back_inserter(v2));

	for(Vec::const_iterator it=v.begin(); it!=v.end(); ++it){
		cout << *it << ",";
	}
	cout << endl;

	for(Vec::const_iterator it=v2.begin(); it!=v2.end(); ++it){
		cout << *it << ",";
	}
	cout << endl;
	return (0);
} // main
//> 0,1,2,3,4,
//> 0,1,2,3,4,  v( ̄Д ̄)v

http://codepad.org/は0x対応してなくてエラー出るのぅ…

*1:名前はtype2typeの方が良かったかも