История изменений
Исправление khrundel, (текущая версия) :
Если это не дурь по типу «хочу сэкономить строчку с кастом», а попытка контролировать целостность типов в реализации наследников, то можно наколхозить такое:
template <typename T>class ATemplate: public A {
protected:
typedef T param_type;
typedef T* param_ptr;
};
class IntegerB: public ATemplate<int> {
public:
void f(void*ptr) override {
auto casted = static_cast<param_ptr>(ptr);
std::cout<<*casted<<std::endl;
}
};
class DoubleB: public ATemplate<double> {
public:
void f(void*ptr) override {
auto casted = static_cast<param_ptr>(ptr);
std::cout<<*casted<<std::endl;
}
};
Ну а если принцпиально экономить касты и/или иметь realF с правильным названием типа в списке параметров, можно по типу QT запилить макрос A_DESCENDANT, который вставлять в начало объявления каждого потомка и чтоб он разворачивался вот в этот оверрайд f, только вместо вывода в cout там вызов realF.
Исходная версия khrundel, :
Если это не дурь по типу «хочу сэкономить строчку с кастом», а попытка контролировать целостность типов в реализации наследников, то можно наколхозить такое:
template <typename T>class ATemplate: public A {
protected:
typedef T param_type;
typedef T* param_ptr;
};
class IntegerB: public ATemplate<int> {
public:
void f(void*ptr) override {
auto casted = static_cast<param_ptr>(ptr);
std::cout<<*casted<<std::endl;
}
};
class DoubleB: public ATemplate<double> {
public:
void f(void*ptr) override {
auto casted = static_cast<param_ptr>(ptr);
std::cout<<*casted<<std::endl;
}
};