Что означает этот typedef? - PullRequest
       10

Что означает этот typedef?

7 голосов
/ 16 марта 2012

В столбце мистера Кенни Керра он определил структуру и определение типа следующим образом:

struct boolean_struct { int member; };
typedef int boolean_struct::* boolean_type;

Тогда что означает этот typedef?

Другой вопрос касается следующего кода:

operator boolean_type() const throw()
{
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr;
}

Что означает "& boolean_struct :: member"?

1 Ответ

13 голосов
/ 16 марта 2012

В этом столбце г-н Кенни Керр, он определил структуру и typedef, как это:

struct boolean_struct { int member; };    
typedef int boolean_struct::* boolean_type;    

Тогда что означает этот typedef?

typedef создает тип с именем boolean_type, который эквивалентен указателю на член int внутри boolean_struct объекта.

Это , а не то же самое, что указатель на int. Разница в том, что для объекта boolean_type требуется объект boolean_struct, чтобы разыменовать его. Обычный указатель на int не делает. Лучший способ понять, чем это отличается, - это использовать несколько примеров кода.

Рассмотрим только нормальные указатели на int с:

struct boolean_struct { int member; }; 

int main()
{
    // Two boolean_struct objects called bs1 and bs2 respectively:
    boolean_struct bs1;
    boolean_struct bs2;
    // Initialize each to have a unique value for member:
    bs1.member = 7;
    bs2.member = 14;

    // Obtaining a pointer to an int, which happens to be inside a boolean_struct:
    int* pi1 = &(bs1.member);
    // I can dereference it simply like this:
    int value1 = *pi1;
    // value1 now has value 7.

    // Obtaining another pointer to an int, which happens to be inside
    // another boolean_struct:
    int* pi2 = &(bs2.member);
    // Again, I can dereference it simply like this:
    int value2 = *pi2; 
    // value2 now has value 14.

    return 0;
}

Теперь рассмотрим, использовали ли мы указатели на int членов внутри boolean_struct:

struct boolean_struct { int member; }; 
typedef int boolean_struct::* boolean_type;   

int main()
{

    // Two boolean_struct objects called bs1 and bs2 respectively: 
    boolean_struct bs1; 
    boolean_struct bs2; 
    // Initialize each to have a unique value for member: 
    bs1.member = 7; 
    bs2.member = 14; 

    // Obtaining a pointer to an int member inside a boolean_struct
    boolean_type pibs = &boolean_struct::member;

    // Note that in order to dereference it I need a boolean_struct object (bs1):
    int value3 = bs1.*pibs;
    // value3 now has value 7.

    // I can use the same pibs variable to get the value of member from a
    // different boolean_struct (bs2):
    int value4 = bs2.*pibs;
    // value4 now has value 14.

    return 0;
} 

Как видите, синтаксис и их поведение различны.

Другой вопрос касается следующего кода:

operator boolean_type() const throw()
{    
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr;  
}

Что означает "& boolean_struct :: member"?

Возвращает адрес переменной member внутри boolean_struct. См. Пример кода выше.

...