LƯU Ý: Câu hỏi này ban đầu được hỏi cách quay lại vào năm 2012. Trước khi trình phân tích decltype
được thực hiện đầy đủ bởi bất kỳ trình biên dịch chính nào. Bạn không nên xem mã này trừ khi bạn chỉ có quyền truy cập vào C++ 03. Tất cả các trình biên dịch C++ 11 chính hiện nay đều hỗ trợ decltype
.Nhận loại thành viên
Có cách nào dễ dàng để truy xuất loại thành viên không?
Trong 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);
}
Tôi đang thực sự làm điều này (tức là hơi lười biếng):
#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;
Nhưng thay vì phải buộc người dùng phải xác định loại của các thành viên Tôi muốn để trình biên dịch tạo ra nó một cách thực dụng.
#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;
Tôi không nghĩ C++ cho phép bạn thậm chí nói về 'Person :: age' mà không có một cá thể' Person' –
@SethCarnegie: Nếu đó là sự thật (và tôi nghĩ nó có thể), nó hơi khó chịu. Làm cách nào để khám phá ra kích thước của 'Person :: age'? –
những gì về việc tạo ra một cái gì đó giống như một 'typedef int Person :: age_t;'? – greatwolf