, . , - , , .
member_type:
template<class type_t, class name_t, type_t default_value = type_t() >
struct member_type {
using type = type_t;
using name = name_t;
type_t value = default_value;
};
, . - :
template<class ... T>
struct t_templated_members
{
using t_members_list = std::tuple<T...>;
t_members_list members;
};
, , , .
struct member_x {};
struct member_y {};
using foo = t_templated_members<
member_type<int, member_x, 10>,
member_type<char, member_y, 'a'> >;
"".
namespace details
{
template<class T, class U, size_t I>
using is_right_member = std::is_same<
typename std::tuple_element_t<I, typename U::t_members_list>::name, T>;
template<class T, class U, size_t I = 0 >
struct find_element : public std::conditional_t<
is_right_member<T, U, I>::value,
std::integral_constant<decltype(I), I>,
find_element<T, U, I + 1>>
{ };
}
template<class T, class U>
auto & member_get(U & host)
{
constexpr auto index = details::find_element<T, U>::value;
return std::get<index>(host.members).value;
};
member_get, , foo:
#include <iostream>
int main()
{
foo my_foo;
auto & x = member_get<member_x>(my_foo);
std::cout << x << ' ';
x = 6;
std::cout << member_get<member_x>(my_foo) << '\n';
std::cout << member_get<member_y>(my_foo) << ' ';
member_get<member_y>(my_foo) = 'b';
std::cout << member_get<member_y>(my_foo) << '\n';
return 0;
}