<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" type="text/css" href="../../default.css">
<title>Boost C++ Libraries</title>
</head>

<body>
<!--#include virtual="../../menu2.html"-->
	<div class="contents">
<h4>contents</h4>
	<ol>
		<li><a href="#install">導入</a></li>
		<li><a href="#class">クラス</a></li>
		<li><a href="#opinion">感想</a></li>
	</ol>
</div>
<h1>Boost C++ Libraries</h1>

<p>Boost C++ Libraries は、<a href="http://www.boost.org/">Boost.org</a>によるC++ライブラリです。
テンプレートを利用した、コンパクトなユーティリティクラス群で構成されています。</p>

<h2 id="install">導入</h2>
<div>
	<p>
		ソースを<a href="http://www.boost.org/">Boost.org</a>からダウンロードします。
		ほとんどの機能はヘッダのインクルードのみで使用可能ですが、いくつかコンパイルの必要があるものがあります。
		……が、うまくコンパイルできなかったので細かいところはよくわかりませんｗ
	</p>
	<p>
		テンプレートを使っている関係で、コンパイラの中には相性の悪いものもあるようです。
		特に、VC++6.0はテンプレートの部分特殊化ができないため、制限が多いです。
	</p>
</div>

<h2 id="class">クラス</h2>
<div>
	<dl>
		<dt>any</dt>
		<dd>
			<p><kbd>any.hpp</kbd> : いわゆるVariant型。代入は楽だが、any_castを使用する読み取りは少し面倒。</p>
		</dd>
		<dt>array</dt>
		<dd>
			<p><kbd>array.hpp</kbd> : 静的にサイズを指定する配列。組み込み配列のラッパー。</p>
		</dd>
		<dt>bind</dt>
		<dd>
			<p><kbd>bind.hpp</kbd> : 関数アダプタ。<code>_1, _2</code> といった記述が特殊だが、std::bind1st, bind2ndよりも直感的。
				<a href="boost/bind_function.cpp">【実験】</a></p>
			<p><kbd>mem_fn.hpp</kbd> : スマートポインタへの対応など、改良されたメンバ関数アダプタ。
				<a href="boost/bind_function.cpp">【実験】</a></p>
		</dd>
		<dt>conversion</dt>
		<dd>
			<p><kbd>cast.hpp</kbd> : 型変換エラー時に例外を投げるキャスト群。<code>polymorphic_cast, polymorphic_downcast, numeric_cast</code></p>
			<p><kbd>lexical_cast.hpp</kbd> : iostreamを利用した型変換。<code>lexical_cast</code></p>
		</dd>
		<dt>function</dt>
		<dd>
			<p><kbd>function.hpp</kbd> : 拡張関数ポインタ。Commandパターンやコールバック関数に便利。policyによる呼び出し制御機能もある。
				<a href="boost/bind_function.cpp">【実験】</a></p>
		</dd>
		<dt>functional</dt>
		<dd>
			<p><kbd>functional.hpp</kbd> : <code>not1/2, bind1st/2nd, ptr_fun, mem_fun, etc.</code> - 「参照の参照」問題に対処された同名のstd関数アダプタの改良版。
				mem_fun に関しては、スマートポインタが使える boost::mem_fn のほうが高性能。</p>
		</dd>
		<dt>lambda</dt>
		<dd>
			<p><code>for_each(a.begin(), a.end(), std::cout &lt;&lt; _1 &lt;&lt; ' ');</code> は衝撃的だが、VC++6&amp;7では動かない。</p>
		</dd>
		<dt>rational</dt>
		<dd>
			<p><kbd>rational.hpp</kbd> : 有理数（分数）クラス。<a href="boost/rational.cpp">【実験】</a></p>
		</dd>
		<dt>smatr_ptr</dt>
		<dd>
			<p><kbd>scoped_ptr.hpp , scoped_array.hpp</kbd> : コピーできないstd::auto_ptr。</p>
			<p><kbd>shared_ptr.hpp, shared_array.hpp, weak_ptr.hpp</kbd> : 非侵襲型参照カウントポインタ。</p>
		</dd>
		<dt>static_assert</dt>
		<dd>
			<p><kbd>static_assert.hpp</kbd> : コンパイル時のアサーション。アライメントのチェックなどに使用する。</p>
		</dd>
		<dt>timer</dt>
		<dd>
			<p><kbd>timer.hpp</kbd> : <code>timer</code> - いわゆるストップウォッチ。返値は秒単位のdouble値。</p>
			<p><kbd>progress.hpp</kbd> : <code>progress_timer</code> - コンストラクト〜デストラクトの時間を計り、経過時間をostreamに出力する。</p>
			<p><kbd>progress.hpp</kbd> : <code>progress_display</code> - テキストベースのプログレスバー。</p>
		</dd>
		<dt>tokenizer</dt>
		<dd>
			<p>文字列の切り出し。CSVの読み込みが非常に楽になりそう。
			内部でctypeのASCII用文字判別関数を使用しているのが災いし、日本語でエラーが出るのが難点。
			<a href="boost/tokenizer.cpp">【実験】</a></p>
		</dd>
		<dt>tuple</dt>
		<dd>
			<p><kbd>tuple/tuple.hpp</kbd> : 3つ以上の要素をもてるstd::pair。複数要素を返値にする関数に使える。VC++との相性は悪い。
				<a href="boost/tuple.cpp">【実験】</a></p>
		</dd>
		<dt></dt>
		<dd>
			<p><kbd></kbd></p>
		</dd>
	</dl>
<hr>
	以下、書きかけ
	<dl>
		<dt>call_traits	</dt>
		<dd>「参照の参照」などの問題を防ぐためのカプセル化ユーティリティ。テンプレートの部分特殊化が必須。</dd>
		<dt>compatibility</dt><dd>&lt;cXXX&gt;, &lt;limits&gt;がないコンパイラのためのヘッダ。特に使う必要はなし。</dd>
		<dt>compose</dt><dd>汎関数（関数の関数）アダプタ。おとなしくforループにしてしまったほうがわかりやすい気も……。</dd>
		<dt>compressed_pair</dt><dd>片方のクラスが空の場合に最適化がかかるpair。</dd>
		<dt>concept_check</dt><dd>テンプレートに関するコンパイルエラーメッセージはわかりにくいのだが、それをわかりやすいメッセージにしてくれる。</dd>
		<dt>config</dt><dd></dd>
		<dt>crc</dt><dd></dd>
		<dt>graph</dt><dd></dd>
		<dt>integer</dt><dd></dd>
		<dt>io_state_savers</dt><dd></dd>
		<dt>iterator_adaptors</dt><dd></dd>
		<dt>math</dt><dd>common_factor, octonion, quaternion, special_functions</dd>
		<dt>operators</dt><dd></dd>
		<dt>pool</dt><dd></dd>
		<dt>preprocessor</dt><dd></dd>
		<dt>property_map</dt><dd>読み書きの許可指定ができるmap？普通のmapとの違いがわかりません。</dd>
		<dt>python</dt><dd></dd>
		<dt>random</dt><dd></dd>
		<dt>ref</dt><dd></dd>
		<dt>regex</dt><dd></dd>
		<dt>test</dt><dd>いわゆるASSERT()。Windowsからだと、main()を置き換えるのと、出力先がコンソールなことが難点。</dd>
		<dt>thread</dt><dd></dd>
		<dt>type_traits</dt><dd>テンプレート引数の情報を得る。static assertと組み合わせるくらいか？</dd>
		<dt>utility</dt><dd>deleteとdelete[]を型チェックする機構。インクリメント、デクリメントのファンクタ。コピーできないクラスのベースクラス。</dd>
	</dl>
</div>

<h2 id="opinion">個人的感想</h2>
<div>
	<p>shared_ptrはとても便利です。
		std::auto_ptrと組み合わせると、本当にガベージコレクションは必要なのかな、という気になってきます。</p>
	<p>関数オブジェクト系は、あまりにテンプレートを酷使するため、よほど詳しくなければC++には見えないでしょう。
		また、C++では無名関数が使えないので、劇的に使い勝手が上がるということはないのでは？</p>
</div>

<hr>
<!--#config timefmt="%Y/%m/%d"-->
<p align="right"><!--#echo var='LAST_MODIFIED'--></p>

</body>
</html>
