boost------result_ofの使用(Boostライブラリ完全開発ガイド)読書ノート

2832 ワード

1、紹介
まず2つの小さなツールクラスresultを見てみましょう.ofとrefは、本章の他のライブラリの基礎です.result_ofは複雑なテクニックを用いて関数の戻り値タイプを自動的に導出し,refはオブジェクトの使用を包装し,パラメータを渡す際にオブジェクトコピーの代価を除去したり,コピーできないオブジェクトをコピー可能にしたりすることができる.
bindはc++98標準ライブラリの関数アダプタの強化であり、関数ポインタ、関数参照、関数オブジェクトを含む任意の呼び出し可能な関数に適応することができ、それらを新しい関数オブジェクトにすることができ、彼はc++関数式プログラミングへの最初のステップである.functionライブラリは、c/c++の関数ポインタタイプを強化し、bindと組み合わせて任意の呼び出し可能なオブジェクトを収容することができます.
最後にsignals 2ライブラリについて議論すると,威力の強い観察者モードを実現し,c#のevent/delegateやJavaのObservable/Observerを使用したことがある場合,signals 2がc++に対応する重要な意義が分かる.
2、result_of
result_ofは小さいが役に立つコンポーネントであり、プログラマが呼び出し式の戻りタイプを決定するのに役立ち、主に汎用プログラミングや他のBoostライブラリコンポーネントに使用され、TR 1に収められている.
げんり
内部タイプでresult_を定義できる呼び出し式を指定します.of<...>::typeは戻り値のタイプを取得します.
関数ポインタ、関数参照、またはメンバー関数ポインタ、もちろん関数オブジェクトタイプ、そのインスタンスがfuncであるタイプFuncがあるとします.Funcにはoperator()があり、パラメータは(T 1 t 1,T 2 t 2)、ここでT 1,T 2は2つのテンプレートタイプであり、result_of::typeはfunc(t 1,t 2)の戻り値タイプである.
次のコード(簡単な例)を見てみましょう.
#include "stdafx.h"
#include "boost/utility/result_of.hpp"
#include "iostream"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	typedef double (*Func)(double d);
	Func fun = sqrt;
	boost::result_of<Func(double)>::type x = fun(5.0);

	cout << typeid(x).name() << endl;

	return 0;
}

typedef double(*Func)(doubled);この行のコードは、doubleタイプを受け入れ、doubleタイプを返す関数ポインタタイプFuncを定義します.Func func = sqrt;この行のコードは1つのFuncの1つのインスタンスの変数funcを宣言して、1つの具体的な関数のポインタ、そしてそれをsqrtに割り当てて、実行して、彼が表示したのはdoubleです
ここではあまり魅力的ではありません.BOOSTを使用します.AUTOも同様の機能を果たすことができます.
#include "stdafx.h"
#include "boost/utility/result_of.hpp"
#include "boost/typeof/typeof.hpp"
#include "iostream"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	typedef double (*Func)(double d);
	Func fun = sqrt;
	BOOST_AUTO(x, fun(5.0));

	cout << typeid(x).name() << endl;

	return 0;
}

複雑な例を見て、パラメータのdoubleタイプを返しましょう.
#include "stdafx.h"
#include "boost/utility/result_of.hpp"
#include "boost/typeof/typeof.hpp"
#include "iostream"
using namespace std;
using namespace boost;


template<typename T, typename T1>
typename boost::result_of<T(T1)>::type call_func(T t, T1 t1)
{
	return t(t1);
}


int _tmain(int argc, _TCHAR* argv[])
{
	typedef double (*Func)(double d);
	Func fun = sqrt;
	BOOST_AUTO(x, call_func(fun, 5.0));

	cout << typeid(x).name() << endl;

	return 0;
}

一般的なコンテキストの中で、周囲に実際のタイプがなく、式がない場合、BOOST_AUTOはどうしようもありませんが、実例ではBOOST_を使います.AUTO結合result_of,これによりテンプレートタイプのパラメータが正しく得られる.
注意:
ここでresult_of<>::typeの前にキーワードtypenameを付けます.そうしないと、コンパイラはtypeをresult_と見なします.of<>のメンバー変数で、宣言が見つからないエラーが発生します.