boost::result_of

トップページ > メタプログラミング >

abstract

必要なヘッダ
<boost/utility/result_of.hpp>
出来ること
関数適用の結果の型を計算
リファレンス
en

sample

#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() の結果は処理系依存です。 他の処理系ではこんなに綺麗に出ないこともあります。)

etc

関数(オブジェクト)の型と引数の型がわかってるときに、 その関数を呼び出した結果の型がどうなるか、を計算してくれるテンプレートです。

template<typename T1, typename T2>
  ???? fwd_to_hoge(T1 x1, T2 x2) { return hoge(x1,x2); }

みたいに、 最終的に別の関数の適用結果を返すテンプレートの返値型をどうやって宣言しようという状況で役に立ちます。 完全な typeof があれば result_of は不要になるのですが、 それまでの橋渡し役ということで。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0