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.