over for c++ c++11 auto

c++ - for - Exponer un tipo privado con auto: ¿dónde puede ser útil?



iterate map c++ 11 (2)

Puede ser útil si el tipo de retorno no está especificado. Por ejemplo, el objeto devuelto de una llamada a std::bind , o anteriormente boost::bind , no se especifica. Es un functor definido por la implementación, pero no se puede saber su tipo sin mirar los detalles de la implementación. Antes de la palabra clave auto C ++ 11, podría usar boost::function como un tipo de variable para almacenar el resultado de bind , o podría pasar el resultado de bind a una función que toma un argumento de plantilla. Con C ++ 11, puede almacenar el objeto de resultado usando auto .

Por lo tanto, si una clase tiene algún tipo interno, no es necesario exponer el tipo real a una API pública. Un usuario de la clase puede simplemente usar la palabra clave auto , y la documentación de la API puede decir que el tipo es "no especificado". Esto mantiene el tipo interno real como un detalle de implementación privada, que a menudo puede mejorar la encapsulación.

En esta question se discutió por qué exponer un tipo privado con auto :

#include <iostream> using namespace std; class Base { class PrivateClass { public: void bar() { cout << "PrivateClass" << endl; } }; public: PrivateClass foo() { PrivateClass a; return a; } }; int main() { Base b; auto p = b.foo(); p.bar(); return 0; }

Está perfectamente bien por el estándar C ++ 11. Lo que todavía no entiendo es cómo este idioma puede ser útil en una aplicación real. ¿Hay problemas en los que este idioma se puede utilizar de manera efectiva o debería considerarse como un efecto secundario "curioso" de la palabra clave?


Ya sea que la palabra clave y las subclases "automáticas" proporcionen dicha característica, el concepto de "tipos privados" parece poco práctico.

Antes de la POO, algunos desarrolladores ocultan algún tipo utilizando un puntero (void *) a una "estructura". Otro caso más actualizado permitió que un objeto de una clase dada, fuera expuesto solo por una superclase.