Converting enum values to strings, and vice versa
enum class Color { Red, Green, Blue };
template
std::string enum_to_string(E value) {
constexpr auto enum_info = reflect(E);
for (const auto& enumerator : enum_info.enumerators()) {
if (enumerator.value() == value) {
return std::string(enumerator.name());
}
}
return "Unknown";
}
template
E string_to_enum(const std::string& str) {
constexpr auto enum_info = reflect(E);
for (const auto& enumerator : enum_info.enumerators()) {
if (enumerator.name() == str) {
return enumerator.value();
}
}
throw std::invalid_argument("Invalid enum string");
}
Parsing command line arguments from a struct definition
struct CLIOptions {
std::string input_file;
int num_threads = 1;
bool verbose = false;
};
template
T parse_cli_args(int argc, char* argv[]) {
T options;
constexpr auto struct_info = reflect(T);
for (int i = 1; i
Simple definition of tuple and variant types
// Common data structure used in examples below
struct Person {
std::string name;
int age;
double height;
};
// Tuple, without reflection
int main() {
std::tuple person_tuple{"John Doe", 30, 175.5};
std::cout (person_tuple) (person_tuple) (person_tuple) person_tuple{"John Doe", 30, 175.5};
std::apply([](const auto&... args) {
(..., (std::cout var;
var = 42;
std::cout (var) (var) (var);
std::cout ;
if constexpr (std::is_same_v)
std::cout )
std::cout )
std::cout var;
var = 42;
std::cout (var) (var) );
std::cout
Automatic conversion between struct-of-arrays and array-of-structs
template
auto soa_to_aos(const StructOfArrays& soa) {
std::array aos;
constexpr auto struct_info = reflect(Struct);
for (size_t i = 0; i
auto aos_to_soa(const std::array& aos) {
StructOfArrays soa;
constexpr auto struct_info = reflect(Struct);
for (size_t i = 0; i
Universal formatter:
template
std::string format(const T& obj) {
std::ostringstream oss;
constexpr auto type_info = reflect(T);
oss
Hashing a struct by iterating over its fields:
template
size_t hash_struct(const T& obj) {
size_t hash = 0;
constexpr auto type_info = reflect(T);
for (const auto& member : type_info.members()) {
hash ^= std::hash{}(member.get(obj)) + 0x9e3779b9 + (hash > 2);
}
return hash;
}
Convert between struct and tuple, tuple concatenation, named tuples:
// Struct to tuple
template
auto struct_to_tuple(const Struct& s) {
return std::apply([&](auto&&... members) {
return std::make_tuple(members.get(s)...);
}, reflect(Struct).members());
}
// Tuple to struct
template
Struct tuple_to_struct(const Tuple& t) {
Struct s;
std::apply([&](auto&&... members) {
((members.set(s, std::get(t))), ...);
}, reflect(Struct).members());
return s;
}
// Tuple concatenation
template
auto tuple_concat(Tuples&&... tuples) {
return std::tuple_cat(std::forward(tuples)...);
}
// Named tuple
template
struct NamedTuple {
REFLECT_NAMED_MEMBERS(Members...);
};