Клонируемый шаблон идиомы с помощью шаблонов

#c #templates

Вопрос:

Я хотел уменьшить количество шаблонов при добавлении clone() методов в некоторый существующий код. Я придумал следующие шаблоны:

 template<typename Interface>
class CloneableInterface {
public:
    virtual std::unique_ptr<Interface> clone() = 0;
};

template<typename Interface, typename Implementation>
class CloneableImpl : public Interface {
public:
    std::unique_ptr<Interface> clone() override {
        return std::unique_ptr<Interface>(
                new Implementation(*((Implementation *) this)));
    }
};
 

Таким образом, можно определить интерфейс, который имеет метод виртуального клонирования, например:

 class Base; // forward declaration
class Base : public CloneableInterface<Base> { ... };
 

И его реализация(ы) выглядит так:

 class Impl; // forward declaration

class Impl : public CloneableImpl<Base, Impl> {
public:
    Impl(const Implamp;); // copy constructor
};
 

Я что-то не так делаю? например, должен ли я ожидать, что столкнусь с некоторыми проблемами в будущем?