Po obejrzeniu wielu przykładów metaprogramowania w C++, które pozwalają na wykreślenie właściwości klas (takich jak knowing if a type is a specialization of a template) lub ustalenie, czy klasa zawiera dany typ zagnieżdżony; ale zastanawiałem się, czy można napisać test lub cechę, która określa odwrotność ostatniego - sprawdzić, czy dany Type
jest zagnieżdżony w obrębie class
lub struct
.C++ - Wiesz, czy typ/klasa jest zagnieżdżona?
Innymi słowy, szukam odpowiednika następującym Pseudokod:
template <typename Type> struct is_nested {
enum { value = {__some magic__} };
};
typedef int type1;
struct Something { typedef int internal_type; };
typedef Something::internal_type type2;
//...later, likely at a different scope
is_nested<int>::value; // yields false
is_nested< std::vector<int>::iterator >::value; // yields true
is_nested<type1>::value; // yields false
is_nested<type2>::value; // yields true
wiem, że mogę używać sizeof
wdrożyć tak/nie testy, a przypuszczam Type
jest częścią tych badań, ale nie mogę wymyślić, jak podłączyć jakiś rodzaj "dowolnego realnego typu" do testu tak, że mogę utworzyć wyrażenie takie jak Anytype::Type
.
template struct is_nested { typedef char yes; typedef struct { char u[2]; } no; // Herein lies the problem ???? static yes test(char [ sizeof(Anytype::Type) ]) ; ???? static no test(...); public: enum { value = sizeof(test(0)) == sizeof(char) }; };
(Zauważ, że nie obchodzi mnie ani (można sobie pozwolić) wie co typ będzie Type
być zagnieżdżone w; wszystko to ma znaczenie to, czy jest zagnieżdżony w coś czy nie Innymi słowy. ta cecha powinna tylko zależą Type
.)
szukam dla C++ czy to rozwiązanie w C++ lub C++ 11 03, ale w pierwszym przypadku chciałbym powitać go znacznie więcej, jeśli go był zwrotny.
Na czym polega problem, który ma rozwiązać? –
Jestem głównie teoretyzowania, w jaki sposób poprawić moje [adaptacja typesafe enums w C++ 03] (http://stackoverflow.com/a/11856721/399580) przez wyłączenie operatorów relacyjnych dla 'enum's, które są zagnieżdżone wewnątrz struktury; jest to jedno z dwóch podejść, które studiuję, aby rozwiązać ten problem. –