可以将name作为参数传递给c ++模板吗?

ano*_*non 5 c++ templates

是否可以写一个类:

template<typename T, ... name> struct Magic {
  T name;
};
Run Code Online (Sandbox Code Playgroud)

这样:

Magic<int, foo> gives:

Magic<int, foo> {
  int foo;
}
Run Code Online (Sandbox Code Playgroud)

Magic<float, bar> gives:

Magic<float, bar> {
  float bar;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我希望不仅能够指定Type,还能指定成员变量的名称.

Geo*_*che 5

这是不可能的,您必须使用基于宏的解决方案或使用提供命名成员的预定义类型集.

一种可能的基于宏的方法:

#define MAGIC(name_) \
    template<typename T> struct Magic1 { \
        T name_; \
    };

MAGIC(foo);
Run Code Online (Sandbox Code Playgroud)

要么:

#define MAGIC(type_, name_) \
    struct Magic1 { \
        type_ name_; \
    };

MAGIC(foo);
Run Code Online (Sandbox Code Playgroud)

使用预处理器魔法,例如使用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;
Run Code Online (Sandbox Code Playgroud)

使用编译时列表然后可以从n named_member实例继承,Boost.MPL可以在这里提供帮助.