LINUX.ORG.RU

История изменений

Исправление 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;
	}	
};