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

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

8
задан Cœur 29 July 2017 в 09:59
поделиться