Boost C++ Librariesに関する小ネタ、気づき、メモなど。
boost::make_shared
make_sharedの引数はconst参照なので、非constな引数を持つコンストラクタには使えない。
boost::numeric::ublass
普通のvector, matrixは構築時、resize時にそれらの要素が0クリアされるが、bounded_vector, bounded_matrixは0クリアされない。
boost::noncopyable
これらの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等でのビルド方法
- boostをダウンロード。適当なディレクトリに展開し、展開したディレクトリに入る。
- ./bootstrap.sh
- ./bjam
Visual C++ 2010でのビルド方法
フォルダを作る。ここでは C:\develop とする。
これをC:\develop\ 下に展開する。 C:\develop\boost_1_43_0 というフォルダができる。
これをC:\develop\ 下に展開する。 C:\develop\zlib-1.2.3 というフォルダができる。
これをC:\develop\ 下に展開する。 C:\develop\bzip2-1.0.5 というフォルダができる。
この中に入っている 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