这是不可能的,你不得不求助于基于宏的解决方案或使用预定义的一组提供指定成员的类型。
一种可能的基于宏的方法:
#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;
使用编译时间列表,那么你可以从ňnamed_member
实例继承,Boost.MPL可以帮助这里。
模板处理类型。他们可以引用的唯一名称是类型名称,而不是词汇名称。预处理器用于词汇名称。 – GManNickG 2010-02-19 00:45:08
我能想到的唯一方法就是使用继承+ crtp模式,比如'struct bar_variable {float bar; }; struct Magic:named_variable {}; Magic ;' –
Anycorn
2010-02-19 00:46:21