「Boostいろいろ」の編集履歴(バックアップ)一覧はこちら
「Boostいろいろ」(2010/08/14 (土) 17:10:22) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
Boost C++ Librariesに関する小ネタ、気づき、メモなど。
#contents(,option=word)
----
*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手法には大きな違いはないように思われるが、
実はちょっとした差がある。
#highlight(c++){{
#include <boost/noncopyable.hpp>
class A : boost::noncopyable {};
int main() {
A a;
return 0;
}
}}
はコンパイル可能だが、
#highlight(c++){{
#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()を定義する必要がある。
#highlight(c++){{
#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 とする。
最新版の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
に含まれている。
----
Boost C++ Librariesに関する小ネタ、気づき、メモなど。
#contents(,option=word)
----
*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手法には大きな違いはないように思われるが、
実はちょっとした差がある。
#highlight(c++){{
#include <boost/noncopyable.hpp>
class A : boost::noncopyable {};
int main() {
A a;
return 0;
}
}}
はコンパイル可能だが、
#highlight(c++){{
#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()を定義する必要がある。
#highlight(c++){{
#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 とする。
最新版の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
に含まれている。
----