ไลบรารีมาตรฐานของคุณสำหรับการเขียนโปรแกรมเมตา
# 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
จะมีเว็บไซต์คงที่แบบเดียวกับที่มีให้ทางออนไลน์ทุกประการ โปรดทราบว่า Git จะละเว้น doc/html
โดยอัตโนมัติ ดังนั้นการอัปเดตเอกสารจะไม่ส่งผลเสียต่อดัชนีของคุณ
การเตรียมตัวเองให้พร้อมทำงานกับฮานาเป็นเรื่องง่าย ขั้นแรกคุณจะต้องติดตั้ง CMake เมื่อเสร็จแล้ว คุณสามารถ cd
ไปที่รูทของโปรเจ็กต์และตั้งค่าไดเร็กทอรี build:
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 แยกกัน เนื่องจากขณะนี้ห้องสมุดค่อนข้างเสถียร