W moim projekcie chcę zaimplementować szablonową klasę proxy niektórych istniejących większych klas. Istniejące klasy są klasami bibliotek, więc nie można ich modyfikować. W większości przypadków klienci nie wiedzą, że obiekty są instancjami klasy proxy lub większej klasy. W niektórych przypadkach klienci MUSZĄ jednak znać szczegółowe informacje o klasie. Ponieważ klasa proxy sama jest klasą szablonów, nie sądzę, aby proste przeciążanie funkcji przez nazwę klasy mogło rozwiązać ten problem. Możliwe rozwiązanie, które moim zdaniem polega na dodaniu wewnętrznej klasy zagnieżdżonej lub typedef wewnątrz klasy proxy, a klient sprawdza, czy ta klasa/typedef istnieje, aby uzyskać informacje o klasie. Moje pytanie brzmi: jak sprawdzić, czy klasa określiła zagnieżdżoną definicję klasy lub typedef w C++ 11?Jak sprawdzić, czy klasa określiła zagnieżdżoną definicję klasy lub typedef w C++ 11?
poniższych kodów pokazują przykład:
#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;
}
jak zaimplementować klasę cech is_proxy
?
Użyj [SFINAE] (http://en.wikipedia.org/wiki/SFINAE). – iammilind
Nie używaj nazw takich jak '_To', są one zarezerwowane dla implementacji. – Xeo