#ifndef CTTI_TIE_HPP #define CTTI_TIE_HPP #include #include #include namespace ctti { namespace detail { template struct tie_t; template struct tie_t, ctti::meta::list> { constexpr tie_t(Refs&... refs) : _refs{refs...} {} template void operator=(const T& object) { assign(object, ctti::meta::make_index_sequence_for()); } private: template using Symbol = ctti::meta::pack_get_t; template::template is_member_of() >::type> void assign_member(const T& object) { std::get(_refs) = ctti::get_member_value>(object); } template::template is_member_of() >::type> void assign_member(const T& object) {} template void assign(const T& object, ctti::meta::index_sequence) { [](...){}((tie_t::assign_member(object), 42)...); } std::tuple _refs; }; } template constexpr ctti::detail::tie_t< ctti::meta::list, ctti::meta::list > tie(Refs&... refs) { return {refs...}; } } #endif // CTTI_TIE_HPP