std::array<std::byte, info.total_size> storage;
};
Now to finally use it:
using Struct = MetaAggregate<
Field{ type<int>, "integer_1"_name },
Field{ type<int>, "integer_2"_name },
Field{ type<std::string>, "string_1"_name },
Field{ type<std::string>, "string_2"_name }
>;
int main()
{
Struct::dump_layout();
Struct blah{ 1, 2, "3", "4" };
std::println("By name:");
std::println("blah[\"integer_1\"_field] = {}", blah["integer_1"_field]);
std::println("blah[\"integer_2\"_field] = {}", blah["integer_2"_field]);
std::println("blah[\"string_1\"_field] = {}", blah["string_1"_field]);
std::println("blah[\"string_2\"_field] = {}", blah["string_2"_field]);
blah["string_1"_field] = "foo";
std::println("By index:");
std::println("blah.get<0>() = {}", blah.get<0>());
std::println("blah.get<1>() = {}", blah.get<1>());
std::println("blah.get<2>() = {}", blah.get<2>());
std::println("blah.get<3>() = {}", blah.get<3>());
std::println("Structured bindings:");
auto [a, b, c, d] = blah.refs();
std::println("a = {}", a);
std::println("b = {}", b);
std::println("c = {}", c);
std::println("d = {}", d);
}
It's ugly, but it works.
----
### Caveats
- Since we rely on placement `new`, it cannot be made `constexpr`, sadly;
- Usage is awkward compared to real `struct`s;
- Getting all the reference categories right is tricky, I probably missed something.
I would definitely **NOT** recommend using this in production, but it was kinda fun to see whether it was possible.
https://redd.it/1t6tzvc
@r_cpp
Post #25152
11