Skip to content

Instantly share code, notes, and snippets.

@jacquelinekay
Created March 20, 2017 23:39
Show Gist options
  • Save jacquelinekay/6bcacee7a3bce7d82b9d6387b6afee96 to your computer and use it in GitHub Desktop.
Save jacquelinekay/6bcacee7a3bce7d82b9d6387b6afee96 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <string>
#include <reflexpr>
#include <type_traits>
namespace product_type {
namespace meta = std::meta;
template <typename PT>
struct size : meta::get_size<meta::get_data_members_m<reflexpr(PT)>> {};
template <auto N, typename PT>
constexpr auto get(PT&& pt) {
using Element = meta::get_element_m<meta::get_data_members_m<reflexpr(PT)>, N>;
return pt.*(meta::get_pointer<Element>::value);
}
template <std::size_t N, class PT>
struct element {
using Element = meta::get_element_m<meta::get_data_members_m<reflexpr(PT)>, N>;
// error: __unrefltype operator not applicable to a
// metaobject reflecting a data member
// TODO: why???
// using type = meta::get_reflected_type_t<Element>;
using type = decltype(std::declval<PT>().*(meta::get_pointer<Element>::value));
};
}
struct foo {
int a;
std::string b;
};
int main() {
foo f{1, "hello"};
std::cout << "Size of foo: " << product_type::size<foo>::value << "\n";
std::cout << "2nd member of foo: " << product_type::get<1>(std::move(f)) << "\n";
using FooBType = product_type::element<1, foo>::type;
std::cout << "Type of second member of foo: "
<< std::meta::get_base_name_v<std::meta::get_aliased_m<reflexpr(FooBType)>> << "\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment