Безумный шаблон C ++ - шаблон для доступа к отдельным атрибутам класса

Я начинающий программист на C ++, но думал, что знаю о C ++ достаточно, до сегодняшнего дня, когда я наткнулся на такой код на работе и не смог понять, как он на самом деле работает.

class Object
{
};

template <
        class PropObject,
        class PropType, 
        PropType PropObject::* Prop
        >
class PropReader
{
public:
    void print(Object& o)
    {
        PropObject& po = static_cast<PropObject &>(o);
        PropType& t = po.*Prop;

        cout << t << "\n";
    }
};

class Student : public Object
{
public:
    int age;
    int grade;
};

int _tmain(int argc, _TCHAR* argv[])
{   
    Student s;
    s.age = 10;
    s.grade = 5;

    PropReader<Student, int, &Student::age> r;
    PropReader<Student, int, &Student::grade> r2;

    r.print(s);
    r2.print(s);
}

Я думаю, что я любезен из понятых на высоком уровне. Но этот конкретный PropType PropObject :: * Prop в объявлении шаблона меня беспокоит. Что это означает? Ищу объяснение от экспертов по C ++. Я хотел бы понять это, чтобы лучше использовать. Хотя это выглядит очень полезным.

15
задан templatetypedef 2 August 2011 в 20:11
поделиться