メタプログラミング用の標準ライブラリ
# include < boost/hana.hpp >
# include < cassert >
# include < string >
namespace hana = boost::hana;
using namespace hana ::literals ;
struct Fish { std::string name; };
struct Cat { std::string name; };
struct Dog { std::string name; };
int main () {
// Sequences capable of holding heterogeneous objects, and algorithms
// to manipulate them.
auto animals = hana::make_tuple (Fish{ " Nemo " }, Cat{ " Garfield " }, Dog{ " Snoopy " });
auto names = hana::transform (animals, []( auto a) {
return a. name ;
});
assert ( hana::reverse (names) == hana::make_tuple ( " Snoopy " , " Garfield " , " Nemo " ));
// No compile-time information is lost: even if `animals` can't be a
// constant expression because it contains strings, its length is constexpr.
static_assert ( hana::length (animals) == 3u , " " );
// Computations on types can be performed with the same syntax as that of
// normal C++. Believe it or not, everything is done at compile-time.
auto animal_types = hana::make_tuple (hana::type_c<Fish*>, hana::type_c<Cat&>, hana::type_c<Dog*>);
auto animal_ptrs = hana::filter (animal_types, []( auto a) {
return hana::traits::is_pointer (a);
});
static_assert (animal_ptrs == hana::make_tuple (hana::type_c<Fish*>, hana::type_c<Dog*>), " " );
// And many other goodies to make your life easier, including:
// 1. Access to elements in a tuple with a sane syntax.
static_assert (animal_ptrs[0_c] == hana::type_c<Fish*>, " " );
static_assert (animal_ptrs[1_c] == hana::type_c<Dog*>, " " );
// 2. Unroll loops at compile-time without hassle.
std::string s;
hana::int_c< 10 >. times ([&]{ s += " x " ; });
// equivalent to s += "x"; s += "x"; ... s += "x";
// 3. Easily check whether an expression is valid.
// This is usually achieved with complex SFINAE-based tricks.
auto has_name = hana::is_valid ([]( auto && x) -> decltype (( void )x. name ) { });
static_assert ( has_name (animals[0_c]), " " );
static_assert (! has_name ( 1 ), " " );
}
http://boostorg.github.io/hana でドキュメントをオンラインで参照できます。このドキュメントには、ライブラリのインストール、hana とは何かとその使用方法を説明するチュートリアル、例を含む広範なリファレンス セクションなど、必要なものがすべて網羅されています。この README の残りの部分は、主にライブラリ自体に取り組みたい人向けであり、ユーザー向けではありません。
ドキュメントのオフライン コピーは、 gh-pages
ブランチをチェックアウトすることで入手できます。現在のディレクトリの上書きを避けるために、 gh-pages
ブランチをdoc/html
のようなサブディレクトリに複製できます。
git clone http://github.com/boostorg/hana --branch=gh-pages --depth=1 doc/html
これを発行すると、 doc/html
はオンラインで利用できるものとまったく同じ静的 Web サイトが含まれるようになります。 doc/html
Git によって自動的に無視されるため、ドキュメントを更新してもインデックスが汚染されないことに注意してください。
Hana に取り組むための準備は簡単です。まず、CMake のインストールが必要です。これが完了したら、プロジェクトのルートにcd
してビルド ディレクトリをセットアップできます。
mkdir build
cmake -S . -B build
システムのコンパイラが古すぎるため、カスタム コンパイラを指定したい場合があります。
cmake -S . -B build -DCMAKE_CXX_COMPILER=/path/to/compiler
通常、これで問題なく動作します。ただし、一部の古いシステムでは、デフォルトで提供される標準ライブラリやコンパイラが C++14 をサポートしていません。これに該当する場合は、Wiki にさまざまなシステムでのセットアップに関する詳細情報が記載されています。
通常、システム上に Boost ヘッダーがある場合、hana はそれを見つけようとします。持っていなくても大丈夫です。その場合、Boost ヘッダーを必要とするいくつかのテストが無効になります。ただし、hana に Boost のカスタム インストールを使用させたい場合は、このカスタム インストールへのパスを指定できます。
cmake -S . -B build -DCMAKE_CXX_COMPILER=/path/to/compiler -DBOOST_ROOT=/path/to/boost
これで、単体テストと例をビルドして実行できるようになりました。
cmake --build build --target check
単体テストのコンパイルには、特に外部アダプターのテストではかなりの時間と RAM を消費することに注意してください。これは、 Hana の単体テストが非常に徹底的であること、また、他のライブラリの異種シーケンスではコンパイル時のパフォーマンスがひどい傾向にあるという事実によるものです。
必要なソフトウェアがコンピュータ上で利用可能な場合にのみ有効になるオプションのターゲットもあります。たとえば、ドキュメントを生成するには Doxygen がインストールされている必要があります。オプションのターゲットが無効になるたびに、CMake 生成ステップ中に情報メッセージが出力されます。不足しているソフトウェアをインストールしてから、CMake 生成を再実行して、利用可能なターゲットのリストを更新できます。
ヒント
help
ターゲットを使用すると、使用可能なすべてのターゲットのリストを取得できます。
単体テストまたはサンプルを追加する場合は、 test/
またはexample/
にソース ファイルを追加し、CMake 生成ステップを再実行して、新しいソース ファイルがビルド システムに認識されるようにします。プロジェクトのルートから新しいソース ファイルへの相対パスがpath/to/file.cpp
であると仮定します。 CMake 生成ステップを再実行すると、 path.to.file
という名前の新しいターゲットが作成され、同じ名前のテストも作成されます。したがって、
cmake --build build --target path.to.file # Builds the program associated to path/to/file.cpp
ctest --test-dir build -R path.to.file # Runs the program as a test
Sublime Text ユーザーへのヒント
提供されている hana.sublime-project ファイルを使用する場合は、「[hana] Build current file」ビルド システムを選択できます。ターゲットが関連付けられているファイル (テストやサンプルなど) を表示する場合、⌘B を押してファイルをコンパイルするか、⇧⌘B を使用してコンパイルして実行できます。
プロジェクトはいくつかのサブディレクトリで構成されています。
doc/html
サブディレクトリは Git によって自動的に無視されます。上で説明したように、 gh-pages
ブランチをそのディレクトリに複製することで、ドキュメントのローカル コピーを簡単に保存できます。CONTRIBUTING.md を参照してください。
LICENSE.mdを参照してください。
リリースは現在、ブースト リリース プロセスを通じてのみ行われます。ライブラリは現在かなり安定しているため、hana の個別のリリースはありません。