self en c: la implementación autónoma
la palabra clave, ampliamente utilizada en idiomas como PHP, plantea un desafío en C debido a la ausencia de un mecanismo equivalente. Si bien una implementación específica de clase que utiliza typedefs anidadas es sencilla, requiere duplicación y riesgos para la introducción de errores sutiles. Este artículo explora una solución elegante que usa DeclType y plantillas para lograr una autogestivo autónoma.
declarando a sí mismo con DeclType
el intento inicial de introducir DeclType falla porque intenta acceder a este fuera de una instancia. Para resolver esto, necesitamos encapsular la Declaración de autopista dentro de una plantilla:
templateclass SelfBase : public Ts... { protected: typedef X self; };
esta plantilla sirve como la clase base para tipos que pueden acceder a self.
conveniencia macros
para hacer que el uso de SelfBase sea simplificado, dos macros se introducen:
[&]ejemplos
usando estas macros, ahora podemos definir las clases con self:class con { prueba vacía () { yo foo; // Self ya está disponible } }; // herencia múltiple Clase With_Self_derived (Bar, Foo, Foo2) { / * ... */ };
class WITH_SELF(Foo) { void test() { self foo; // self is now available } }; // Multiple inheritance class WITH_SELF_DERIVED(Bar,Foo,Foo2) { /* ... */ };conclusion
aprovechando decltype y plantillas, es posible implementar un tipo de miembro de sí mismo autónomo en c. Este enfoque permite el uso de Self dentro de las clases sin el riesgo de errores silenciosos debido a la redefinición de clase defectuosa. Las macros de conveniencia proporcionadas hacen que la implementación sea sencilla y flexible, lo que permite múltiples herencias de clase base y diferentes combinaciones de clases básicas y regulares.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3