shared_from_this
можно использовать для получения shared_ptr
от объекта, которым уже управляет shared_ptr
.
Вызов shared_from_this
для не общего объекта является неопределенным поведением в C ++ 11.
Однако в C ++ 17 shared_from_this
сгенерирует bad_weak_ptr
, и вы можете поймать это исключение:
#include <memory>
#include <iostream>
class X : public std::enable_shared_from_this<X> {
public:
bool is_shared() const {
try {
shared_from_this();
return true;
} catch (std::bad_weak_ptr&) {
return false;
}
}
};
int main() {
X x;
std::cout << std::boolalpha << x.is_shared() << std::endl;
auto y = std::make_shared<X>();
std::cout << y->is_shared() << std::endl;
}
Выход:
false
true
Кроме того, вы можете использовать weak_from_this
, чтобы получить доступ к weak_ptr
expired
методу:
bool is_shared() const {
return !weak_from_this().expired();
}