Skip to content

Repository files navigation

Type Utils

Type utilities library for things like template packs, structs, functions, enums.

usingnamespacekaixo;structStruct {
int a;
double b;
float c;
};
intmy_fun(double, long, int, float) { return1; }
enum my_enum { Value1, Value2 };
// boolean operations on type traitstemplate<require<is_integral || is_floating_point> Ty> structmy_type {};
intmain() {
// Simple type traitsstatic_assert(info<int>::is_integral); static_assert(info<double[3][5]>::extent<1> == 5);
static_assert(info<double, long, int, float>::can_invoke<decltype(my_fun)>);
// Query function informationstatic_assert(info_v<my_fun>::arguments::size == 4); static_assert(same_as<info_v<my_fun>::result::type, int>); static_assert(same_as<info_v<my_fun>::pointer::type, int(*)(double, long, int, float)>);
// Query struct member typesstatic_assert(info<Struct>::members::size == 3);
static_assert(same_as<info<Struct>::members::element<0>::type, int>);
// Complex template pack manipulationstatic_assert(info<int, double, float>::filter<is_integral>::size == 1);
static_assert(info<int, double, int>::indices<int>.size() == 2); // result: std::array{ 0ull, 2ull }static_assert(same_as<info<int, double, int, float>::unique, info<int, double, float>>);
static_assert(info<int, unsigned, float, double>::count_filter<is_integral> == 2);
// Enum value namesstatic_assert(info<my_enum>::name<Value1> == "Value1");
static_assert(info<my_enum>::name<1> == "Value2");
static_assert(info<my_enum>::defined<0> == true);
static_assert(info<my_enum>::defined<3> == false);
// Type manipulationstatic_assert(same_as<info<int&>::add_cvref_from<constint>::type, constint&>);
static_assert(same_as<info<constint&>::copy_ref_to<int>::type, int&>);
// Sort typesstatic_assert(same_as<
info<uint16_t, uint64_t, uint8_t, uint32_t>::sort<type_sorters::size_desc>,
info<uint64_t, uint32_t, uint16_t, uint8_t>
>);
// Transform pack of typesstatic_assert(same_as<
info<std::vector<int>, std::vector<double>>::transform<grab::reference>,
info<int&, double&>
>);
return0;
}

About

Type utilities for things like template packs, structs, functions, enums. Complex template pack manipulation.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages