¿Cómo verificar si una clase ha especificado una definición de clase anidada o typedef en C ++ 11?

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 una clase proxy o una clase más grande. Sin embargo, en algunos casos, 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 una simple sobrecarga de funciones por nombre de clase pueda resolver este problema. La posible solución que pensé es agregar una clase anidada interna 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 verificar 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 de rasgosis_proxy?

Respuestas a la pregunta(4)

Su respuesta a la pregunta