En mi proyecto, quiero implementar una clase de proxy de plantilla de algunas clases más grandes existentes. Las clases existentes son clases de biblioteca, por lo que no se pueden modificar. En la mayoría de los casos, los clientes no saben que los objetos son instancias de clase proxy o clase más grande. En algunos casos, sin embargo, los clientes DEBEN conocer la información detallada de la clase. Dado que la clase proxy es en sí misma una clase de plantilla, no creo que la simple sobrecarga de funciones por nombre de clase pueda resolver este problema. La posible solución que pensé es agregar una clase interna anidada o typedef dentro de la clase proxy, y el cliente verifica si esta clase/typedef existe para obtener la información de la clase. Mi pregunta es: ¿cómo comprobar si una clase ha especificado una definición de clase anidada o typedef en C++ 11?¿Cómo comprobar si una clase ha especificado una definición de clase anidada o typedef en C++ 11?
Los siguientes códigos muestran un ejemplo:
#include <iostream>
#include <functional>
#include <string>
#include <vector>
#include <type_traits>
typedef std::string CBig1; // use string for demonstration
typedef std::string CBig2; // use string for demonstration
//class CBig1; // the bigger class 1, codes of which can not be changed
//class CBig2; // the bigger class 2, codes of which can not be changed
template <typename _Big, typename _Other>
class CProxy
{
public:
struct proxy_tag { };
};
// how to implement this ?
// the proxy traits class, if defined _T::proxy_tag, the ``type'' will be std::true_type, otherwise the ``type'' will be std::false_type
template <typename _T>
struct is_proxy
{
//typedef std::true_type type;
//typedef std::false_type type;
};
template <typename _T>
void ClientHelp(const _T& t, std::false_type)
{
// process real class
std::cerr << "real class" << std::endl;
}
template <typename _T>
void ClientHelp(const _T& t, std::true_type)
{
// process proxy class
std::cerr << "proxy class" << std::endl;
}
template <typename _T>
void Client(const _T& t)
{
ClientHelp(t, typename is_proxy<_T>::type());
}
int main(int argc, char* argv[])
{
CBig1 b;
CProxy<CBig1, int> p;
Client(b);
Client(p);
return 0;
}
cómo implementar la clase rasgos is_proxy
?
Utilice [SFINAE] (http://en.wikipedia.org/wiki/SFINAE). – iammilind
No use nombres como '_This', están reservados para la implementación. – Xeo