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