Boostいろいろ

Boost C++ Librariesに関する小ネタ、気づき、メモなど。

boost::make_shared

make_sharedの引数はconst参照なので、非constな引数を持つコンストラクタには使えない。


boost::numeric::ublass

普通のvector, matrixは構築時、resize時にそれらの要素が0クリアされるが、bounded_vector, bounded_matrixは0クリアされない。


boost::noncopyable

C++において、あるクラスのオブジェクトのコピーを禁止するためには、コピー禁止ミックスイン(Non-copyable Mixin)と呼ばれる手法を使えば良い。
これは、boostライブラリではboost:noncopyableで実現出来る。
http://www.kmonos.net/alang/boost/classes/noncopyable.html

他方、Google C++スタイルガイドでは、マクロを利用した別の方法が紹介されている。
http://www.textdrop.net/google-styleguide-ja/cppguide.xml#%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AA%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF

これらの2手法には大きな違いはないように思われるが、
実はちょっとした差がある。
#include <boost/noncopyable.hpp>
 
class A : boost::noncopyable {};
 
int main() {
  A a;
  return 0;
}
 
はコンパイル可能だが、
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
private:                                   \
  TypeName(const TypeName&);               \
  void operator=(const TypeName&)
 
class A {
  DISALLOW_COPY_AND_ASSIGN(A);
};
 
int main() {
  A a;
  return 0;
}
 
はコンパイルできない。
何故なら、このコードではA::A()が存在しないため。
(class AはコピーコンストラクタA::A(const A&)を宣言しているので、コンパイラがデフォルトコンストラクタA::A()を勝手に作らない。)
以下のように、明示的にA::A()を定義する必要がある。
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
private:                                   \
  TypeName(const TypeName&);               \
  void operator=(const TypeName&)
 
class A {
public:
  A() {}
  DISALLOW_COPY_AND_ASSIGN(A);
};
 
int main() {
  A a;
  return 0;
}
 


Boostのコンパイル

date_time, regex, thread, python, signals, test, filesystem, serialization, program_options 等はヘッダをインクルードするだけでは使えず、ライブラリを構築する必要がある。

Unix, Cygwin等でのビルド方法

  1. boostをダウンロード。適当なディレクトリに展開し、展開したディレクトリに入る。
  2. ./bootstrap.sh
  3. ./bjam

Visual C++ 2010でのビルド方法

フォルダを作る。ここでは C:\develop とする。

最新版のboost (1.43.0) をダウンロード。
http://sourceforge.net/projects/boost/files/boost/1.43.0/

これをC:\develop\ 下に展開する。 C:\develop\boost_1_43_0 というフォルダができる。

zlibソースをダウンロード。どうやら最新版 (1.2.5)には未対応のようなので、古いバージョン (1.2.3) を取ってくる。
http://sourceforge.net/projects/libpng/files/zlib/

これをC:\develop\ 下に展開する。 C:\develop\zlib-1.2.3 というフォルダができる。

libbzip2ソース最新版 (1.2.5) をダウンロード。
http://www.bzip.org/downloads.html

これをC:\develop\ 下に展開する。 C:\develop\bzip2-1.0.5 というフォルダができる。

boost-jamの実行ファイル (boost-jam-3.1.18-1-ntx86.zip) をダウンロード。
http://sourceforge.net/projects/boost/files/

この中に入っている bjam.exe を C:\develop\boost_1_43_0 に置く。

Visual Studio コマンド プロンプト (2010)を開き、
cd C:\develop\boost_1_43_0
bjam --toolset=msvc-10.0 -sBZLIB2_SOURCE="/develop/bzip2-1.0.5" -sZLIB_SOURCE="/develop/zlib-1.2.3" --stagedir=. stage
しばし待てば、出来上がり。

必要なものは
  • C:\develop\boost_1_43_0\boost
  • C:\develop\boost_1_43_0\doc
  • C:\develop\boost_1_43_0\lib
に含まれている。


最終更新:2010年08月14日 17:10
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。