una tipos son reservada que palabra metodos los inmutables enum elementos ejemplos clases clase atributos c++ types static-methods

tipos - Tipo C++ de clase envolvente en función miembro estática



que son los wrapper en java (3)

C ++ no tiene ninguna función para obtener el nombre de la clase actual, espacio de nombres, etc. En C ++ 11 puede obtener el tipo de variable, pero necesita la variable en primer lugar. En este caso no tienes nada para empezar.

Supongo que esto es absolutamente imposible, pero qué pasa si. ¿Es posible obtener de alguna manera el tipo de clase envolvente en una función miembro estática, en cualquier versión de C ++?

class Impossible { public: static void Fun() { typedef Impossible EnclosingClass; // now do something with EnclosingClass ... } }

¿Hay una manera de obtener el tipo de la clase adjunta ( Impossible en este caso) sin escribir el nombre de la clase en la función?

La razón por la que me gustaría hacer eso es para evitar repetir el nombre de la clase en la función. Podría fácilmente conducir a un error de copia-pegar difícil de encontrar, si algo como esto sucediera:

class SomeOther { // another class, with the same interface as Impossible public: static void Fun() { typedef Impossible EnclosingClass; // whoops, copy-pasted, forgot to change "Impossible" to "SomeOther" // now do something with EnclosingClass ... } }

¿Hay una buena manera de evitar que esto suceda? Podría imaginar tocar algo que se declaró privado en la clase adjunta, pero eso me obligaría a escribir código adicional (ya que mi diseño actual no contiene ningún miembro privado inherente, todo es público).


El problema es que C ++ carece de una palabra clave self .

Normalmente escribo:

struct Foo { typedef Foo self; static void bar() { self* ptr = nullptr; } };

Me doy cuenta de que todavía tiene que asegurarse de que el typedef sea ​​correcto, pero al menos de esta manera puede tenerlo en la parte superior de la definición de tipo donde lo notará.

Con hackers, sin embargo, puedes hacer esto completamente autónomo .


Me gusta la idea de intentar introducir algún nombre general al que puedas referirte en clases no relacionadas; Para mantenibilidad.

Mi primer enfoque sería simple: Proporcionar un typedef en la clase adjunta. Dé a typedef el mismo nombre en todas las clases no relacionadas.

class Impossible { public: typedef Impossible Enclosing; static void Fun() { Enclosing* theObject = 0; } };

Hacer esto también tendrá el efecto, y yo lo llamaría un beneficio , de no compilar en nuevas clases no relacionadas en las que no haya proporcionado el typedef .