#include <iostream>
#include <typeinfo>
#include <boost/function.hpp>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_same.hpp>
using namespace std;
using namespace boost;
using namespace boost::mpl;
// いろいろな関数宣言
typedef int (*F1)(double,double);
typedef boost::function<bool()> F2;
struct F3 {
template<typename T> struct result
: if_<is_same<T,F3(int)>, char, void*> {};
char operator()(int);
void* operator()(float);
};
// result_ofを使ってみる
#include <boost/utility/result_of.hpp>
typedef boost::result_of<F1(double,double)>::type X1;
typedef boost::result_of<F2()>::type X2;
typedef boost::result_of<F3(int)>::type X3;
typedef boost::result_of<F3(float)>::type X4;
int main()
{
cout << typeid(X1).name() << endl;
cout << typeid(X2).name() << endl;
cout << typeid(X3).name() << endl;
cout << typeid(X4).name() << endl;
}
int bool char void *
(Visual C++ 2005 の場合。typeid(...).name() の結果は処理系依存です。 他の処理系ではこんなに綺麗に出ないこともあります。)
関数(オブジェクト)の型と引数の型がわかってるときに、 その関数を呼び出した結果の型がどうなるか、を計算してくれるテンプレートです。
template<typename T1, typename T2>
???? fwd_to_hoge(T1 x1, T2 x2) { return hoge(x1,x2); }
みたいに、 最終的に別の関数の適用結果を返すテンプレートの返値型をどうやって宣言しようという状況で役に立ちます。 完全な typeof があれば result_of は不要になるのですが、 それまでの橋渡し役ということで。