Non è possibile, è necessario ricorrere a soluzioni basate su macro o utilizzare un set predefinito di tipi che forniscono membri denominati.
Un possibile approccio macro-based:
#define MAGIC(name_) \
template<typename T> struct Magic1 { \
T name_; \
};
MAGIC(foo);
o:
#define MAGIC(type_, name_) \
struct Magic1 { \
type_ name_; \
};
MAGIC(foo);
Usando la magia preprocessore, per esempio utilizzando Boost.Preprocessor, dovresti essere in grado di generare n membri con nome in un modo più conveniente.
Un altro approccio potrebbe essere utilizzando un insieme predefinito di classi che forniscono alcuni membri nominati in che si eredita:
enum { MemberNameFoo, MemberNameBar };
template<class T, int id>
struct named_member;
template<class T>
struct named_member<T, MemberNameFoo> {
T foo;
};
template<class T>
struct named_member<T, MemberNameBar> {
T bar;
};
// holder for the above, just one member for this example:
template<class T, int name>
struct holder : named_member<T, name> {};
// using it:
typedef holder<int, MemberNameFoo> HasFoo;
typedef holder<int, MemberNameBar> HasBar;
Utilizzando compilare in tempo le liste si potrebbe poi ereditare da nnamed_member
istanze, Boost.MPL potrebbe aiutare qui .
fonte
2010-02-19 00:43:59
I modelli gestiscono i tipi. Gli unici nomi a cui possono fare riferimento sono i nomi dei tipi, non i nomi lessicali. Il preprocessore è per i nomi lessicali. – GManNickG
l'unico modo in cui posso pensare è usare l'ereditarietà + pattern crtp, come 'struct bar_variable {float bar; }; struct Magic: named_variable {}; Magia ; ' –
Anycorn