делает то, что надо, или нет? И если нет, то укажите что именно
#include <iostream>
#include <string>
#include <memory>
#include <typeinfo>
#include <cassert>
struct Base {
virtual std::string me() { return "Base"; }
};
struct Derived : Base {
virtual std::string me() override { return "Derived"; }
};
struct DoubleDerived : Derived {
virtual std::string me() override { return "DoubleDerived"; }
};
template <typename B, typename D>
std::shared_ptr<B> clone(std::shared_ptr<B> ptr) {
auto downcasted = std::dynamic_pointer_cast<D>(ptr);
assert(downcasted);
auto cloned = std::make_shared<D>(*downcasted);
auto upcasted = std::static_pointer_cast<B>(cloned);
return upcasted;
}
int main() {
auto bd = std::static_pointer_cast<Base>(std::make_shared<Derived>(Derived()));
auto bdd = std::static_pointer_cast<Base>(std::make_shared<DoubleDerived>(DoubleDerived()));
auto dd = std::static_pointer_cast<Derived>(std::make_shared<DoubleDerived>(DoubleDerived()));
std::cout << "-----------------Original ptrs--------------------" << std::endl;
std::cout << bd->me() << std::endl;
std::cout << bdd->me() << std::endl;
std::cout << dd->me() << std::endl;
auto bd_clone = clone<Base, Derived>(bd);
auto bdd_clone = clone<Base, DoubleDerived>(bdd);
auto dd_clone = clone<Derived, DoubleDerived>(dd);
std::cout << "------------------Cloned ptrs--------------------" << std::endl;
std::cout << bd_clone->me() << std::endl;
std::cout << bdd_clone->me() << std::endl;
std::cout << dd_clone->me() << std::endl;
}
Вот это ты ништяк срезки делаешь
а если местами параметры поменяешь нужно будет только один из них писать
Обсуждают сегодня