Я никогда раньше не видел ничего подобного - я немного новичок в shared_ptr - это типичная операция с общим указателем или здесь кто-то делает что-то необычное? Это не похоже на разыменование - похоже, что кто-то пытается убедиться, что оператор -> () определен ...

Я сделал google / duckduckgo по этому поводу всеми возможными способами, но не могу найти хороших примеров в Интернете.

Спасибо.

void fn(std::shared_ptr<int> data){
if(data.operator->() == NULL){
return; //this is an error
}

....//rest of function, doesn't matter

}
0
Mister Jeps 18 Ноя 2019 в 22:01

1 ответ

Лучший ответ

От

T* operator->() const noexcept;

Вы обращаетесь к внутреннему указателю shared_ptr. Если он не равен NULL, вы можете читать данные, указанные этим указателем. Для этого необходимо использовать:

T& operator*() const noexcept;

Поэтому, когда вы хотите проверить, указывает ли shared_ptr какие-то данные и читает их, вы можете написать:

void fn(std::shared_ptr<int> data) {
    if(data.operator->() == NULL) // dereference pointer
       return; //this is an error

    int value = data.operator*(); // dereference data pointed by pointer
}

Приведенный выше код представляет собой довольно интересный способ использования экземпляров shared_ptr. Вместо вызова операторов, таких как функции-члены - obj.operator @(), вы можете использовать более короткую форму, применив @obj:

 // this code does the same thing as above
void fn2(std::shared_ptr<int> data)
{
    if(!data)
       return; //this is an error

    int value = *data;
    std::cout << value << std::endl;
}

Для получения дополнительных сведений см. Ссылку.

1
rafix07 18 Ноя 2019 в 22:42