Я думаю, вы не задаете правильный вопрос.
Чтобы сделать то, что вы просите, все, что вам нужно, это добавить:
template<typename T>
class helper : public main_resource_handler
{
public:
virtual resource* create_resource() { return new T; }
virtual void do_some(resource* st) { do_some_specific(static_cast<T*>(st)); }
private:
virtual void do_some_specific(T* st) = 0;
};
И измените это:
class specific_resource_handler : public helper<specific_resource>
{
private:
virtual void do_some_specific(T* st) { ... }
}
static_cast
безопасен только в том случае, если вы можете гарантировать, что вы всегда будете вызывать do_some
для правильного типа обработчика. Но если вы уже знаете, что это правильный тип обработчика, тогда нет необходимости делать вызов метода базового класса. Предположительно, вам нужно получить какой-то resource
, не зная его точного типа, и передать его соответствующему обработчику. Это хитрее ...