Нет способов определить имена членов в шаблонах. Вам нужно будет указать все явно, как это:
template<typename ObjT, typename MemberT, MemberT ObjT::*Ptr>
struct member{};
mpl::vector
<
member<Object, string, &Object::a>,
member<Object, int, &Object::b>,
member<Object, long, &Object::c>,
member<Object, char, &Object::d>
>;
Другой вариант - создать функции, помогающие генерировать member
, определить operator>>
для member
, который объединяет их в member_vec
, и operator>>
для member_vec
, который объединяется в больший member_vec
. Поскольку вы используете только тип, компилятор может оптимизировать любые реальные вызовы функций
Функции могут использовать неявные аргументы шаблона, поэтому сериализаторам требуется чуть меньше кода для определения:
auto serializer =
mem(&Object::a) >>
mem(&Object::b) >>
mem(&Object::c) >>
mem(&Object::d);
Я сам сделал сериализаторы, используя обе техники. Второй - это то, чем я больше всего доволен.