Как проверить, определил ли класс определение вложенного класса или typedef в C ++ 11?

В моем проекте я хочу реализовать шаблонный прокси-класс некоторых существующих больших классов. Существующие классы являются библиотечными классами, поэтому их нельзя изменить. В большинстве случаев клиенты не знают, что объекты являются экземплярами прокси-класса или более крупного класса. Однако в некоторых случаях клиенты ДОЛЖНЫ знать подробную информацию о классе. Поскольку прокси-класс сам по себе является шаблоном, я не думаю, что простая перегрузка функций по имени класса может решить эту проблему. Возможно, я решил добавить внутренний вложенный класс или typedef в прокси-класс, и клиент проверит, существует ли этот class / typedef для получения информации о классе. Мой вопрос: как проверить, определил ли класс определение вложенного класса или typedef в C ++ 11?

Следующие коды показывают пример:

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

Как реализовать класс чертis_proxy?

Ответы на вопрос(2)

Ваш ответ на вопрос