he utilizado std::mem_fn
y std::bind
para el alojamiento de estilo reflexión.
Así que tendría un class SomeClass
con un vector de AbstractProperty
. No puede haber varios tipos diferentes de clases de AbstractProperty
, como PropertyFloat
, PropertyU32
, etc.
Luego, en SomeClass
lo haré bind
a un std::function
para AbstractProperty
. Me bind
haciendo
std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)
Para una función de tipo de organismo, me gustaría utilizar
std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)
Por supuesto, para ajustar las funciones de la clase es más difícil, pero sí utilizar un std::function
hacer asi que. En PropertyFloat
tengo
typedef std::function<float(void)> GetterType;
Así que puse a través de una función, me paso la primera std::bind
me presenté como el parámetro para
typename PropertyFloat::GetterType getter
Por supuesto, los tipos podrían hacer uso de plantillas y ser más genérico, pero eso es una compensación según lo que está desarrollando.
+1. Ese es el tipo de cosas que quiero probar también. ¿Tiene más detalles para compartir sobre cómo se hizo el bit de reflexión? – Fanatic23
Hmm, esto fue básicamente lo máximo que pude describir sin probablemente poner toda la base de código en github o algo así (y el código es de fuente cerrada). Actualicé mi publicación para proporcionar más detalles. Desafortunadamente, no hay mucha documentación para el tipo de sistema que desarrollé aquí. Estoy en el proceso de escribir un documento grande en todo el sistema, pero todavía no está terminado. Puedo decir que he estado usando 'std :: mem_fn' y' std :: bind' para este tipo de cosas durante casi dos años, sin problemas. – josephthomas
También no, que este es uno de los usos más complejos de 'mem_fn' y' bind' que yo sepa. Si buscas practicar con los dos tipos, tal vez deberías considerar algunos pequeños usos de ellos (lo hice al principio antes de desarrollar este sistema). Este sistema de reflexión se basa en el uso de estos dos tipos (y 'std :: function'). Aunque honestamente, esto puede ser simplemente reemplazado con punteros de función de miembro (en teoría). Ambos tienen sus ventajas y desventajas. – josephthomas