Проверьте, является ли текущий базовый тип std :: shared_ptr <> T - PullRequest
0 голосов
/ 14 июля 2020

У меня есть общий указатель, в котором хранится базовый класс, например:

std::shared_ptr<Base> baseClassPointer;

Как мне проверить, содержит ли он в настоящее время экземпляр SuperClassA? Где:

public class SuperClassA : public Base {} // There can be many other superclasses

Я пробовал что-то вроде ниже, но явно не сработало:

std::is_same<SuperClassA, decltype(baseClassPointer->get())>::value;

1 Ответ

0 голосов
/ 14 июля 2020

Для тех, кто хочет узнать, как я это сделал, вот:

bool same = typeid(SuperClassA) == typeid(*baseClassPointer->get());

Или:

bool same = std::dynamic_pointer_cast<SuperClassA>(baseClassPointer).use_count() > 0;

Или даже лучше (с точки зрения производительности):

bool same = dynamic_cast<SuperClassA*>(baseClassPointer->get()) != nullptr;
...