Eso no es posible, debe recurrir a soluciones basadas en macros o utilizar un conjunto predefinido de tipos que proporcionan miembros con nombre.
Un posible enfoque basado en la macro:
#define MAGIC(name_) \
template<typename T> struct Magic1 { \
T name_; \
};
MAGIC(foo);
o:
#define MAGIC(type_, name_) \
struct Magic1 { \
type_ name_; \
};
MAGIC(foo);
Usando magia preprocesador, por ejemplo utilizando Boost.Preprocessor, debe poder generar n miembros nombrados de una manera más conveniente.
Otro enfoque podría ser el uso de un conjunto predefinido de clases que proporcionan ciertos representantes nombrados en que se hereda:
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;
El uso de tiempo de compilación listas que luego podría heredar de nnamed_member
ejemplificaciones, Boost.MPL podría ayudar aquí .
Plantillas de tipos de control. Los únicos nombres a los que pueden hacer referencia son nombres de tipos, no nombres léxicos. El preprocesador es para nombres léxicos. – GManNickG
la única forma en que puedo pensar es en usar el patrón inheritance + crtp, como 'struct bar_variable {float bar; }; struct Magic: named_variable {}; Magic ; ' –
Anycorn