BOOST_TYPEOF(exp)

#include <boost/typeof/typeof.hpp>

#include <boost/type_traits/is_same.hpp>
#include <boost/static_assert.hpp>


BOOST_STATIC_ASSERT(( boost::is_same<BOOST_TYPEOF(10), int>::value ));
BOOST_STATIC_ASSERT(( boost::is_same<BOOST_TYPEOF(0.0f), float>::value ));
BOOST_STATIC_ASSERT(( boost::is_same<BOOST_TYPEOF('a'), char>::value ));


struct my_class{
	float x;
};
my_class hoge;

BOOST_STATIC_ASSERT(( 
	boost::is_same<BOOST_TYPEOF(hoge), my_class>::value
));

BOOST_STATIC_ASSERT(( 
	boost::is_same<BOOST_TYPEOF(hoge.x), float>::value
));


int func(){
	return 10;
}

BOOST_STATIC_ASSERT(( 
	boost::is_same<BOOST_TYPEOF(func()), int>::value
));


// ここら辺はむりぽ
/*
template<
	typename T,
	typename U
>
auto
plus(T lhs, U rhs)->BOOST_TYPEOF(lhs + rhs){
	return lhs + rhs;
}

void
foo(my_class a, BOOST_TYPEOF(a.x) value);
*/


C++0x の decltype と同じように、式から型を推論してくれます。
いやーちょっと試してみたんですが、すごく変態ですねー(褒めてます。
関数の戻り値なんかもちゃんと返してくれます。
こんな変態なライブラリの中身をちょっと覗いてみたんですがさっぱり何をやっているのか理解出来ません。
GCCだと__typeof__ で展開してくれるらしいのですが、msvc だとどうやってるのか全然分からない。
RTTIなの?バカなの?死ぬの?
早く、decltype が欲しいです><


[boost]
ver 1.44.0
[参照]
http://www.kmonos.net/alang/boost/classes/typeof.html
http://shinh.skr.jp/m/?date=20060624