메타프로그래밍을 위한 표준 라이브러리
# 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
온라인에서 사용할 수 있는 것과 정확히 동일한 정적 웹사이트가 포함됩니다. doc/html
은 Git에서 자동으로 무시되므로 문서를 업데이트해도 색인이 오염되지 않습니다.
Hana에서 작업할 준비를 하는 것은 쉽습니다. 먼저 CMake를 설치해야 합니다. 이 작업이 완료되면 프로젝트 루트로 cd
하여 빌드 디렉터리를 설정할 수 있습니다.
mkdir build
cmake -S . -B build
때로는 시스템의 컴파일러가 너무 오래되었기 때문에 사용자 정의 컴파일러를 지정하고 싶을 수도 있습니다.
cmake -S . -B build -DCMAKE_CXX_COMPILER=/path/to/compiler
일반적으로 이것은 잘 작동합니다. 그러나 일부 이전 시스템에서는 기본적으로 제공되는 표준 라이브러리 및/또는 컴파일러가 C++14를 지원하지 않습니다. 귀하의 경우라면, 다른 시스템에서 귀하를 설정하는 방법에 대한 더 많은 정보가 위키에 있습니다.
일반적으로 Hana는 시스템에 Boost 헤더가 있는 경우 이를 찾으려고 합니다. 없어도 괜찮습니다. 이 경우 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의 별도 릴리스는 없습니다.