Dopo aver visto molti esempi di metaprogrammazione in C++ che consentono di capire le proprietà delle classi (come knowing if a type is a specialization of a template), o sapere se una classe incorpora un dato tipo annidato; ma mi chiedevo se fosse possibile scrivere un test o un tratto che determina l'inverso dell'ultimo - per verificare se un dato Type
è nidificato all'interno di un class
o struct
.C++ - Sapere se un tipo/classe è annidato?
In altre parole, sto cercando l'equivalente del seguente pseudocodice:
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
So che posso usare per implementare sizeof
sì/no test, e presumo Type
fa parte di quei test, ma non riesco a capire come inserire una sorta di "qualsiasi tipo valido" nel test in modo da poter formare un'espressione come 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) }; };
(Si noti che non mi interessa né (posso permettermi di) sapere che cosa tipo sarebbe Type
essere annidato in, tutto ciò che conta è se è annidato in qualcosa o meno in altre parole. , questa caratteristica dovrebbe solo dipenderà Type
.)
sto cercando una soluzione di C++ sia in C++ 11 o C++ 03, ma nel primo caso avrei accoglierla molto di più se era backportable.
Qual è il problema che questo è destinato a risolvere? –
Sto principalmente teorizzando su come migliorare il mio [adattamento delle enumerazioni typesafe in C++ 03] (http://stackoverflow.com/a/11856721/399580) disabilitando gli operatori relazionali per 'enum's che sono annidati all'interno le strutture; questo è uno dei due approcci che sto studiando per affrontare questo problema. –