Что ж, ответ Макнеллиса довольно прост и прост.Но, если вам интересно, вполне возможно построить именно то, что вам нужно, после использования шаблонного метапрограммирования.Я совершенствовал библиотеку, чтобы сделать это в течение прошлого года.
Я не могу поделиться всем этим, она является собственностью и не принадлежит мне.Но я могу указать вам направление, которое мне показалось наиболее простым в использовании.Ознакомьтесь с методами, описанными в 9.5 Метапрограммирования шаблонов C ++ Абрахамсом и Гуртовым.Сравните это с такими объектами, как boost :: tuple и boost :: fusion.Обратите внимание, что вы можете объявлять «имена», определяя новые типы.Таким образом, вы можете создать что-то, что вы можете использовать, например, так:
struct object_with_properties : construct_property_object< mpl::vector< mpl::pair< property<access,type>, name> ... > >::type
{};
object_with_properties owp;
get<name>(owp);
set<name>(owp, value);
// or maybe
get<name>(owp) = value;
Моя система фактически позволяет вам определять такие объекты, свойства которых реализуются функциями.Хотя это намного сложнее, и я не нашел способа упростить его до вышеуказанной степени.Для этого я начал со статьи под названием «Поддержка отражений с помощью шаблонного метапрограммирования», которая где-то в сети ... могла бы достать ее из ACM.