2016-04-19 3 views
1

У меня есть базовый класс с чистой виртуальной функцией:переопределения виртуальной функции с шаблонным функции

class Allocator 
{ 
public: 
    template< class T > 
    virtual T* allocate(T type) = 0; 
}; 

с производным классом с шаблонной функцией, дизайн намерением было переопределить эту виртуальную функцию:

class StackAllocator: public Allocator 
{ 
public: 
    StackAllocator(size_t size, void* stackStart = nullptr); 

    template< class T> 
    T* allocate(T Type); 
}; 

Мое намерение проекта заключалось в том, чтобы выделить приоритет выделения в Allocator. Но, очевидно, после прочтения этого, я нашел код выше не будет работать.

Я нашел много решений, которые включают в себя создание самого класса шаблона, но в этой ситуации я не могу этого сделать, поскольку сам StackAllocator должен быть агрегированным по типу при компиляции. И только функция должна иметь дело с различными типами.

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

Любые идеи, как я мог это сделать? или идеи о том, как переделать мой дизайн? (имейте в виду, что я в конечном итоге сделаю много других производных распределителей, чтобы база была необходима.)

Спасибо!

+0

g ++: ошибка: шаблоны могут быть не «виртуальными» –

+0

@ DieterLücking, это все, за чем он задал вопрос. он заявил, что знает, что код, который он опубликовал, не может работать. – xaxxon

+0

, поэтому что-то должно знать тип, который он хочет выделить - либо шаблон класса, либо шаблонный метод в этом классе. Какой смысл иметь виртуальную функцию вообще? это звучит как хороший метод/функция фабрики ванили. Некоторые примеры того, как вы думаете, что будете использовать это, если это сработает, будут полезны. Кроме того, наличие чего-то, возвращающего определенный тип, требует чего-то, чтобы принять этот конкретный тип, поэтому вы не можете просто вызвать это в общем ... – xaxxon

ответ

0

Представьте, что этот код работал, как бы вы его использовали?

У вас есть что-то, что было бы параметризовано с помощью распределителя, но поскольку он возвращает определенный тип, эта вещь должна была бы знать, что делать с этим конкретным типом. это означает, что код либо не является общим (что означает, что нет оснований иметь общий базовый класс, потому что код должен быть специализированным для конкретного типа распределителя), либо он имеет шаблонный подход, чтобы взять соответствующий тип из распределителя, но тогда нет причина иметь виртуальную функцию, поскольку вы можете просто создать очень специфический заводский класс (распределитель), который будет соответствовать шаблонизированному типу используемой вещи.

Вам не нужен шаблонный метод выделения, потому что конкретный подкласс-распределитель не может создавать какой-либо тип. он может сделать только один конкретный тип. Мне кажется, что, возможно, вы хотите использовать частичную специализацию для достижения этого?

http://en.cppreference.com/w/cpp/language/partial_specialization

и использовать эти частичные специализации от чего-то, что шаблонного к типу, который вы хотите создать?

Смежные вопросы