您的元編程標準庫
# 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 是什麼以及如何使用它的教程,以及帶有示例的廣泛參考部分。本自述文件的其餘部分主要是針對那些希望在庫本身上工作的人,而不是針對其使用者。
可以透過查看gh-pages
分支來取得文件的離線副本。為了避免覆蓋目前目錄,您可以將gh-pages
分支複製到子目錄中,例如doc/html
:
git clone http://github.com/boostorg/hana --branch=gh-pages --depth=1 doc/html
發布後, doc/html
將包含與線上可用的完全相同的靜態網站。請注意,Git 會自動忽略doc/html
,因此更新文件不會污染您的索引。
讓自己開始在 Hana 上工作很容易。首先,您需要安裝 CMake。完成此操作後,您可以cd
到專案的根目錄並設定建置目錄:
mkdir build
cmake -S . -B build
有時,您需要指定自訂編譯器,因為系統的編譯器太舊了:
cmake -S . -B build -DCMAKE_CXX_COMPILER=/path/to/compiler
通常,這會很好地工作。但是,在某些較舊的系統上,預設提供的標準函式庫和/或編譯器不支援 C++14。如果您遇到這種情況,維基百科上有更多有關在不同系統上進行設定的資訊。
通常,如果您的系統上有 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。
現在,發布僅透過 Boost 發布流程完成。 Hana 沒有單獨的版本,因為該庫現在相當穩定。