Jak uprościć std::dynamic_cast pointer

0

Mam program, w którym mam vector<std::shared_ptr<Nadklasa>>, który zawiera wiele obiektów klas pochodnych

Jak iteruję po wektorze żeby wykonać działania tych obiektów, to dla jednego specyficznej klasy muszę wywołać dodatkową, małą funkcję.

if wygląda tak:

if (std::dynamic_pointer_cast<Megazord>(vector_npctow[i]) && std::dynamic_pointer_cast<Megazord>(vector_npctow[i])->jestNiezniszczalny()) {
// cos tam rob
}

Da się jakoś uprościć to, że 2 razy nie było tego

 std::dynamic_pointer_cast<Megazord>(vector_npctow[i])

Mam to jeszcze w innym miejscu i lipnie to wygląda

2

Przede wszystkim, masz problem z abstrakcją, skoro musisz takie rzeczy robić. Po to masz interfejsy abyś nie musiał wiedzieć jaka jest implementacja.

Ale rady ogólne radami ogólnymi, a życie życiem. Ja bym powyższe zamknął po prostu w funkcji pomocniczej:

auto isIndestructibleMegazord = [](auto const& interface) {
    auto ptr = std::dynamic_pointer_cast<Megazord>(interface);
    return ptr && ptr->jestNiezniszczalny();
};

if (isIndestructibleMegazord(vector_npctow[i])) {
    //...
}

edit: od C++17 masz if z inicjalizatorem:

if (auto ptr = std::dynamic_pointer_cast<Megazord>(vector_npctow[i]); ptr && ptr->jestNiezniszczalny()) {
    // ...
}
5

Po kiego tak komplikować?
Czemu nie dodać metody jestNiezniszczalny() do klasy nadklasa która jedynie co robi to zwraca false.
W klasie Megazord zwyczajnie ją nadpisujesz.
Więc całość będzie wyglądać następująco:

if(vector_npctow[i]->jestNiezniszczalny())
{
    ...
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1