注: この質問は、もともと 2012 年にさかのぼって尋ねられました。decltype
指定子が主要なコンパイラによって完全に実装される前です。C++03 にしかアクセスできない場合を除き、このコードを見ないでください。すべての主要な C++11 準拠のコンパイラが をサポートするようになりdecltype
ました。
メンバーのタイプを取得する簡単な方法はありますか?
C++03 の場合
struct Person
{
std::string name;
int age;
double salary;
};
int main()
{
std::vector<Person> people; // get a vector of people.
std::vector<GET_TYPE_OF(Person::age)> ages;
ages.push_back(people[0].age);
ages.push_back(people[10].age);
ages.push_back(people[13].age);
}
私は実際にこれを行っています(つまり、少し怠惰です):
#define BuildType(className, member, type) \
struct className ## member: TypeBase<className, type> \
{ \
className ## member() \
: TypeBase<className, type>(#member, &className::member) \
{} \
}
BuildType(Person, name, std::string);
BuildType(Person, age, int);
BuildType(Person, salary, double);
typedef boost::mpl::vector<Personname, Personage, Personsalary> FunckyMTPMap;
しかし、ユーザーにメンバーの型を強制的に指定させるのではなく、コンパイラーに実用的に生成させたいのです。
#define BuildType(className, member) \
struct className ## member: TypeBase<className, TYPE_OF(className ## member)> \
{ \
className ## member() \
: TypeBase<className, TYPE_OF(className ## member)>(#member, &className::member)\
{} \
}
BuildType(Person, name);
BuildType(Person, age);
BuildType(Person, salary);
typedef boost::mpl::vector<Personname, Personage, Personsalary> FunckyMTPMap;