A modern C++ metaprogramming library. It provides high level algorithms to manipulate heterogeneous sequences, allows writing type-level computations with a natural syntax, provides tools to introspect user-defined types and much more
Your standard library for metaprogramming
Overview
#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), "");
}
Depends (5)
Reviews
Builds
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-gcc_13 |
| timestamp |
2025-11-07 12:18:25 UTC (04:30:47 hours ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14-static_O3 |
| timestamp |
2025-11-06 13:46:08 UTC (01 03:03:05 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14-ndebug_O3 |
| timestamp |
2025-11-06 13:45:14 UTC (01 03:03:59 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14-O3 |
| timestamp |
2025-11-06 13:38:26 UTC (01 03:10:47 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_ubuntu_24.04-gcc_13-bindist |
| timestamp |
2025-11-06 13:37:51 UTC (01 03:11:21 days ago) |
| result |
warning (update) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14 |
| timestamp |
2025-11-06 13:32:54 UTC (01 03:16:19 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-w64-mingw32 |
| tgt config |
windows_10-gcc_13.2_mingw_w64-static_O2 |
| timestamp |
2025-11-06 13:32:49 UTC (01 03:16:24 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-w64-mingw32 |
| tgt config |
windows_10-gcc_13.2_mingw_w64-O2 |
| timestamp |
2025-11-06 13:32:17 UTC (01 03:16:55 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-w64-mingw32 |
| tgt config |
windows_10-gcc_13.2_mingw_w64 |
| timestamp |
2025-11-06 13:31:50 UTC (01 03:17:22 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-gcc_13.1 |
| timestamp |
2025-11-06 12:56:10 UTC (01 03:53:03 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-msvc_17.10 |
| timestamp |
2025-11-05 17:53:29 UTC (01 22:55:44 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-clang_18_llvm_msvc_17.10-static_O2 |
| timestamp |
2025-11-05 17:52:55 UTC (01 22:56:18 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-msvc_17.10-static_O2 |
| timestamp |
2025-11-05 17:50:21 UTC (01 22:58:52 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-clang_18_llvm_msvc_17.10-O2 |
| timestamp |
2025-11-05 17:50:20 UTC (01 22:58:53 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-clang_18_llvm_msvc_17.10 |
| timestamp |
2025-11-05 17:46:22 UTC (01 23:02:51 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-msvc_17.10-O2 |
| timestamp |
2025-11-05 17:46:13 UTC (01 23:03:00 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-msvc_17.8-static_O2 |
| timestamp |
2025-11-05 17:43:26 UTC (01 23:05:47 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-gcc_12-bindist |
| timestamp |
2025-11-05 17:38:13 UTC (01 23:11:00 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-msvc_17.8-O2 |
| timestamp |
2025-11-05 17:37:50 UTC (01 23:11:23 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-msvc_17.8 |
| timestamp |
2025-11-05 17:32:50 UTC (01 23:16:23 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-microsoft-win32-msvc14.3 |
| tgt config |
windows_10-clang_17_msvc_msvc_17.10 |
| timestamp |
2025-11-05 17:25:15 UTC (01 23:23:58 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-freebsd13.3 |
| tgt config |
freebsd_13-clang_17 |
| timestamp |
2025-11-05 17:06:03 UTC (01 23:43:10 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-freebsd14.1 |
| tgt config |
freebsd_14-clang_18 |
| timestamp |
2025-11-05 17:04:56 UTC (01 23:44:17 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-freebsd14.1 |
| tgt config |
freebsd_14-clang_18-static_O3 |
| timestamp |
2025-11-05 17:04:18 UTC (01 23:44:55 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-freebsd14.1 |
| tgt config |
freebsd_14-clang_18-O3 |
| timestamp |
2025-11-05 16:58:52 UTC (01 23:50:21 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_17_libc++ |
| timestamp |
2025-11-05 16:56:01 UTC (01 23:53:12 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_17 |
| timestamp |
2025-11-05 16:52:47 UTC (01 23:56:26 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_fedora_40-gcc_14-bindist |
| timestamp |
2025-11-05 13:53:26 UTC (02 02:55:47 days ago) |
| result |
warning (update) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_17_libc++ |
| timestamp |
2025-11-04 22:34:59 UTC (02 18:14:14 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_17 |
| timestamp |
2025-11-04 22:33:12 UTC (02 18:16:01 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_18_libc++-static_O3 |
| timestamp |
2025-11-02 23:11:19 UTC (04 17:37:54 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_18_libc++ |
| timestamp |
2025-11-02 23:10:13 UTC (04 17:39:00 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_18_libc++-O3 |
| timestamp |
2025-11-02 23:09:04 UTC (04 17:40:08 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_18-static_O3 |
| timestamp |
2025-11-02 23:06:05 UTC (04 17:43:08 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_18-O3 |
| timestamp |
2025-11-02 22:58:49 UTC (04 17:50:24 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-clang_18 |
| timestamp |
2025-11-02 22:56:31 UTC (04 17:52:42 days ago) |
| result |
success | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14-static_O3 |
| timestamp |
2025-11-02 09:49:53 UTC (05 06:59:20 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14-O3 |
| timestamp |
2025-11-02 09:33:41 UTC (05 07:15:31 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14-ndebug_O3 |
| timestamp |
2025-11-02 09:33:09 UTC (05 07:16:04 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
aarch64-linux-gnu |
| tgt config |
linux_debian_12-gcc_14 |
| timestamp |
2025-11-02 09:14:45 UTC (05 07:34:28 days ago) |
| result |
warning (update) | warning (test-installed) | log | rebuild |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_18 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_18-O3 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_18-static_O3 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_18_libc++ |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_18_libc++-O3 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_debian_12-clang_18_libc++-static_O3 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-linux-gnu |
| tgt config |
linux_fedora_39-gcc_13-bindist |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-apple-darwin22.5.0 |
| tgt config |
macos_13-clang_15.0 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-apple-darwin23.5.0 |
| tgt config |
macos_14-clang_15.0 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-apple-darwin23.5.0 |
| tgt config |
macos_14-clang_15.0-O3 |
| result |
unbuilt |
| toolchain |
public-0.17.0 |
| target |
x86_64-apple-darwin23.5.0 |
| tgt config |
macos_14-clang_15.0-static_O3 |
| result |
unbuilt |
| target |
x86_64-apple-darwin23.5.0 |
| tgt config |
macos_14-gcc_14_homebrew |
| result |
excluded (https://github) |
| target |
x86_64-apple-darwin23.5.0 |
| tgt config |
macos_14-gcc_14_homebrew-O3 |
| result |
excluded (https://github) |
| target |
x86_64-apple-darwin23.5.0 |
| tgt config |
macos_14-gcc_14_homebrew-static_O3 |
| result |
excluded (https://github) |