An open API service indexing awesome lists of open source software.

https://github.com/redskittlefox/reflexpr

Compile time struct Reflections
https://github.com/redskittlefox/reflexpr

aggregates cpp cpp20 cpp20-library cpp23 header-only reflections structs

Last synced: 8 months ago
JSON representation

Compile time struct Reflections

Awesome Lists containing this project

README

          

[![CMake on multiple platforms](https://github.com/RedSkittleFox/reflexpr/actions/workflows/cmake-multi-platform.yml/badge.svg)](https://github.com/RedSkittleFox/reflexpr/actions/workflows/cmake-multi-platform.yml)

# reflexpr
is a c++20 compile and runtime aggregate reflections header only library. It allows you to iterate over aggregate type's member variables.

# Example Usage
```cpp
#include
#include
#include

struct my_aggregate
{
int a;
float b;
std::string c;
int& d;
};

int main()
{
int d = 5;
my_aggregate obj
{
.a = 1 ,
.b = 3.5f,
.c = "Foxes are great!",
.d = d
};

auto&& [v0, v1, v2, v3] = obj;

// Get Nth member - fox::reflexpr::get(aggregate)
std::cout << fox::reflexpr::get<0>(obj) << '\n'; // prints obj.a

// Iterate over members - fox::reflexpr::for_each(aggregate, func)
fox::reflexpr::for_each(obj, [](auto&& v) {std::cout << v << ' '; }), std::cout << '\n';

// Create a tuple-tie from members - fox::reflexpr::tie(aggregate)
auto tie = fox::reflexpr::tie(obj);
std::cout << (std::get<2>(tie) = 2) << '\n';

// Create a tuple from members - fox::reflexpr::make_tuple(aggregate)
auto tuple = fox::reflexpr::make_tuple(obj);
std::cout << (std::get<2>(tuple)) << '\n';

// Tuple size - fox::reflexpr::tuple_size_v
static_assert(fox::reflexpr::tuple_size_v == static_cast(4));

// Tuple Nth type
static_assert(std::is_same_v, int&>);

return 0;
}
```

# Limitation
Right now it supports only up to 40 member variables.