Шаблонное возвращаемое значение C ++ с чистой виртуальной функцией

У меня есть абстрактный класс Handle , который содержит ссылки на объекты типа T. Я хочу, чтобы этот класс можно было преобразовать to Handle , где U - суперкласс T. Я бы использовал наследование, но здесь это не работает. Как бы я это сделал? Какие есть хорошие альтернативы?

Пример псевдокода:

template<class T>
class Handle {
public:
    virtual ~Handle () {}
    virtual T & operator* () const = 0;
    virtual T * operator-> () const = 0;
    virtual template<class U> operator Handle<U>* () const = 0; // being lazy with dumb pointer
};

template<class T>
class ConcreteHandle : public Handle<T> {
public:
    explicit template<class U> ConcreteHandle (U * obj) : obj(obj) {}
    virtual ~ConcreteHandle () {}
    virtual T & operator* () const {
        return *obj;
    }
    virtual T * operator-> () const {
        return obj;
    }
    virtual template<class U> operator Handle<U>* () {
        return new ConcreteHandle<U>(obj);
    }
private:
    T * obj;
};

По запросу, это то, что я делаю

class GcPool {
public:
    virtual void gc () = 0;
    virtual Handle<GcObject> * construct (GcClass clazz) = 0;
};

class CompactingPool : public GcPool {
public:
    virtual void gc () { ... }
    virtual Handle<GcObject> * construct (GcClass clazz) { ... }
private:
    Handle<GcList<Handle<GcObject> > > rootSet; // this will grow in the CompactingPool's own pool
    Handle<GcList<Handle<GcObject> > > knownHandles; // this will grow in the CompactingPool's own pool.
};

knownHandles должен быть совместим с Handle, чтобы он мог быть в rootSet CompatingPool. То же самое и с rootSet. Я установлю эти специальные ручки, чтобы не возникало проблем с курицей и яйцом.

5
задан Thomas Eding 17 May 2011 в 05:19
поделиться