Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class A
{
private:
int a, b;
...
}
void main()
{
A* a = new A();
int a_b = *(((int*)(a))+1);
...
}
json j2 = {
{"pi", 3.141},
{"happy", true},
{"name", "Niels"},
{"nothing", nullptr},
{"answer", {
{"everything", 42}
}},
{"list", {1, 0, 2}},
{"object", {
{"currency", "USD"},
{"value", 42.99}
}}
};
flat_get<FieldIndex>(value);
MyCustomStruct obj = from_json<MyCustomStruct>("{member1:12, member2:[0.0, 3.14]}")
template <typename T>
auto as_tuple(T&& t) -> tuple<Types...>;
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
#include <iostream>
#include <tuple>
#include <typeinfo>
#include <utility>
namespace reflect {
namespace detail {
template <size_t>
struct ubiq {
template <class T>
constexpr operator T&() const;
};
template <class T>
struct exact {
constexpr operator T&() const;
};
template <class>
using void_t = void;
template <class T, size_t N = sizeof( T ), class S = std::make_index_sequence<N>, class = void>
struct tuple_size_helper : tuple_size_helper<T, N - 1, std::make_index_sequence<N - 1>> {
};
template <class T, size_t N, size_t... I>
struct tuple_size_helper<T, N, std::index_sequence<I...>, void_t<decltype( T{ubiq<I>{}...} )>> {
using type = std::integral_constant<size_t, N>;
};
} // namespace detail
template <class T>
using tuple_size = typename detail::tuple_size_helper<T>::type;
namespace detail {
template <size_t N, class T, class = std::make_index_sequence<N>, class = std::make_index_sequence<tuple_size<T>::value - N - 1>,
class = void>
struct tuple_element_helper;
template <size_t N, class T, size_t... I, size_t... J>
struct tuple_element_helper<N, T, std::index_sequence<I...>, std::index_sequence<J...>,
void_t<decltype( T{ubiq<I>{}..., exact<int>{}, ubiq<J>{}...} )>> {
using type = int;
};
template <size_t N, class T, size_t... I, size_t... J>
struct tuple_element_helper<N, T, std::index_sequence<I...>, std::index_sequence<J...>,
void_t<decltype( T{ubiq<I>{}..., exact<size_t>{}, ubiq<J>{}...} )>> {
using type = size_t;
};
template <size_t N, class T, size_t... I, size_t... J>
struct tuple_element_helper<N, T, std::index_sequence<I...>, std::index_sequence<J...>,
void_t<decltype( T{ubiq<I>{}..., exact<std::string>{}, ubiq<J>{}...} )>> {
using type = std::string;
};
} // namespace detail
template <size_t N, class T>
struct tuple_element {
using type = typename detail::tuple_element_helper<N, T>::type;
};
template <size_t N, class T>
using tuple_element_t = typename tuple_element<N, T>::type;
namespace detail {
template <class T, class = std::make_index_sequence<tuple_size<T>::value>>
struct as_tuple_helper;
template <class T, size_t... I>
struct as_tuple_helper<T, std::index_sequence<I...>> {
using type = std::tuple<tuple_element_t<I, T>...>;
};
} // namespace detail
template <class T>
using as_tuple_t = typename detail::as_tuple_helper<T>::type;
} // namespace reflect
struct s {
int a;
size_t b;
int x;
std::string q;
};
int main()
{
std::cout << reflect::tuple_size<s>() << std::endl;
std::cout << typeid( reflect::tuple_element_t<0, s> ).name() << std::endl;
std::cout << typeid( reflect::tuple_element_t<1, s> ).name() << std::endl;
std::cout << typeid( reflect::tuple_element_t<2, s> ).name() << std::endl;
std::cout << typeid( reflect::tuple_element_t<3, s> ).name() << std::endl;
std::cout << typeid( reflect::as_tuple_t<s> ).name() << std::endl;
}
Очень интересно, но для реальной практики (вроде той задачи про 1000 структур и 3000 сериализаторов) лично я скорее взял бы внешний кодогенератор, чем пошёл по такому пути.
Снимаю шляпу. Автор этой магии продолжает дело Александреску.
Но согласен с предыдущим комментарием про кодогенерацию сторонними средствами. Боюсь даже представить как тут будет выглядеть ошибка компиляции и чего...
Рефлексия в C++14