omo verificar se uma classe especificou uma definição de classe aninhada ou typedef no C ++ 1

No meu projeto, quero implementar uma classe de proxy de modelo de algumas classes maiores existentes. As classes existentes são classes de biblioteca e, portanto, não podem ser modificadas. Na maioria dos casos, os clientes não sabem que os objetos são instâncias da classe proxy ou classe maior. Em alguns casos, no entanto, os clientes DEVEM conhecer as informações detalhadas da classe. Como a classe proxy é ela própria uma classe de modelo, não acho que a simples sobrecarga de função pelo nome da classe possa resolver esse problema. A solução possível que pensei é adicionar uma classe aninhada interna ou typedef dentro da classe proxy, e o cliente verificará se essa classe / typedef existe para obter as informações da classe. Minha pergunta é: como verificar se uma classe especificou uma definição de classe aninhada ou typedef no C ++ 1

Os seguintes códigos mostram um exemplo:

#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;
}

Como implementar a classe de característicasis_proxy?

questionAnswers(4)

yourAnswerToTheQuestion