Почему мы используем шаблон enable_shared_from_this? - PullRequest
0 голосов
/ 08 мая 2018

Недавно я встретил шаблон std::enable_shared_from_this<T>, который совпадает с его Boost версией.
Таким образом, он описывает следующий пример кода:

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

В чем причина создания shared_ptr через f()?
Что не так с shared_ptr<Y> p(new Y);?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Смысл shared_from_this в том, чтобы позволить вам получить shared_ptr, когда у вас нет доступа к нему. Это бессмысленно в вашем примере, потому что ваш пример слишком упрощен. Представьте, что есть какая-то функция, которая получает только Y* или Y&, и ей нужно делиться собственностью с кем-то. Это часто случается с членами из Y, поскольку участники имеют доступ только к this.

0 голосов
/ 08 мая 2018

Что не так с shared_ptr p (новый Y);?

В этом нет ничего плохого, только проблема в том, что у вас может не быть этого внутри члена класса Y, и иногда вы хотите, чтобы член возвращал std::shared_ptr самому себе. std::shared_ptr<Y>( this ) явно неправильный способ его создания.

Интересно, может ли такой пример прояснить ситуацию и все равно будет достаточно просто:

std::shared_ptr<Y> Y::getObject() 
{
     return some_condition ? shared_from_this() : std::make_shared<Y>( somedata );
}
...