Boostいろいろ

「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 に含まれている。 ----

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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