Can I pass a name as an argument to a C ++ template?

Is it possible to write a class:

template<typename T, ... name> struct Magic {
  T name;
};

such that:

Magic<int, foo> gives:

Magic<int, foo> {
  int foo;
}

and

Magic<float, bar> gives:

Magic<float, bar> {
  float bar;
}

Basically, I want to be able to specify not only the type, but also the name of the member variables.

+5
source share
2 answers

This is not possible; you need to resort to macro-based solutions or use the predefined set of types that named members provide.

Possible macro approach:

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

MAGIC(foo);

or

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

MAGIC(foo);

Using preprocessor magic, for example. using Boost.Preprocessor , you should be able to generate n named members in a more convenient way.

, , :

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 .

+5

, . , typelist, , , . , , MyClass::getField<1>().

++ 0x , , variadic templates. , ++.

, . , , , , . , , -, .

+1

All Articles