Парадокс clone используется для создания копии производного класса без кавычек до типа базового класса. К сожалению, clone
должен быть реализован в каждом подклассе (или с mixin с CRTP).
Есть ли вероятность, что С++ 11 decltype
делает это ненужным?
Я не думаю, что приведенный ниже код действительно копирует original
, но просто указывает на него ссылку. Когда я пытался использовать new decltype(*original)
, я получаю сообщение об ошибке:
error: new cannot be applied to a reference type
.
Есть ли еще clone
путь в С++ 11? Или существует какой-то новый способ использования RTTI для копирования объекта производного класса из указателя базового класса?
#include <iostream>
struct Base
{
virtual void print()
{
std::cout << "Base" << std::endl;
}
};
struct Derived : public Base
{
int val;
Derived() {val=0;}
Derived(int val_param): val(val_param) {}
virtual void print()
{
std::cout << "Derived " << val << std::endl;
}
};
int main() {
Base * original = new Derived(1);
original->print();
// copies by casting down to Base: you need to know the type of *original
Base * unworking_copy = new Base(*original);
unworking_copy->print();
decltype(*original) on_stack = *original;
on_stack.print();
return 0;
}