Это невозможно, вам приходится прибегать к решениям на основе макросов или использовать предопределенный набор типов, которые предоставляют именованные элементы.
Возможный подход на основе макросов:
#define MAGIC(name_) \
template<typename T> struct Magic1 { \
T name_; \
};
MAGIC(foo);
или:
#define MAGIC(type_, name_) \
struct Magic1 { \
type_ name_; \
};
MAGIC(foo);
Используя магию препроцессора, например, используя Boost.Preprocessor , вы сможете создавать n именованных членов более удобным способом.
Другой подход может заключаться в использовании предопределенного набора классов, предоставляющих определенные именованные элементы, которые вы наследуете:
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;
Используя списки времени компиляции, вы можете затем наследовать от n named_member
экземпляры, Boost.MPL может помочь здесь.