Hay dos formas principales de hacerlo:
- utilizando una herramienta de análisis externo (como un script en Python enganchados arriba en encuadernaciones Clang)
- utilizando técnicas metaprogramación
.. y por supuesto, pueden mezclarse.
No tengo suficiente conocimiento sobre las vinculaciones de Clang Python para responder a su uso, así que me concentraré en la metapogetación.
Básicamente, lo que está solicitando requiere introspección. C++ no es compatible con la introspección completa, sin embargo, al utilizar trucos de metaprogramación (y la coincidencia de plantillas) puede admitir un subconjunto limitado de técnicas de introspección en tiempo de compilación, que es suficiente para nuestro propósito.
Para mezclar fácilmente la metaprogramación y la operación en tiempo de ejecución, es más fácil poner en funcionamiento una biblioteca: Boost.Fusion.
Si ajusta su estructura de modo que sus atributos se describan en términos de una secuencia de Boost.Fusion, entonces puede aplicar un montón de algoritmo en la secuencia automáticamente. Aquí, un associate sequence es lo mejor.
Porque estamos hablando metaprogramming, the map asocia un tipo a un valor mecanografiado.
Puede iterar sobre esa secuencia usando for_each.
voy a pasar por alto los detalles, simplemente porque ha pasado un tiempo y no me acuerdo la sintaxis involucrado, pero básicamente la idea es llegar a:
// Can be created using Boost.Preprocessor, but makes array types a tad difficult
DECL_ATTRIBUTES((connectionId, int)
(dbApplId, int)
(appDescr, AppDescrType)
...
);
que es sintáctica el azúcar que se declara el Mapa Fusion y sus etiquetas asociadas:
struct connectionIdTag {};
struct dbApplIdTag {};
typedef boost::fusion::map<
std::pair<connectionIdTag, int>,
std::pair<dbApplIdTag, int>,
...
> AttributesType;
AttributesType _attributes;
Entonces, cualquier operación que necesitan ser aplicadas en los atributos puede ser construido simplemente con:
// 1. A predicate:
struct Predicate {
template <typename T, typename U>
void operator()(std::pair<T, U> const&) const { ... }
};
// 2. The for_each function
for_each(_attributes, Predicate());
Se pueden probar las herramientas automáticas de serialización de clases, creo que boost tiene una. ¿Importa qué formato la salida del operador << es para usted? – johnathon
JSON, XML, cualquier cosa que un humano pueda leer está bien para mí. –
* podría * probablemente generarlo con boost PP & MPL – David