Ketchuup69
@Ketchuup69

Как реализовать downcast к шаблону?

Есть класс Base:
class Base
{
	public:
		Base *pointer = nullptr;

		virtual void add(Base *element) = 0;
		virtual void print() const = 0;
};


И есть наследованный от него класс Element:
template <typename T>
class Element : public Base
{
	public:
		Element(T value) : value(value) { }

		virtual void add(Base *element) override
		{
				
		}

		virtual void print() const override
		{
			std::cout << value << std::endl;
		}

	private:
		T value = 0;
};


И функция main:
int main()
{
	Base *s = new Element <short> (1);
	Base *i = new Element <int> (2);
	Base *ll = new Element <long long> (4);

	ll->add(s);
	ll->add(i);
	ll->print();

	delete s;
	delete i;
	delete ll;

	return 0;
}


Как можно лучше реализовать метод add? Метод add предназначен для того чтобы прибавить к значению value объекта, у которого метод add и вызвался, значение value объекта, переданного в метод (функция main должна будет вывести в консоль 7).

Моя попытка реализации:
#include <iostream>
#include <typeinfo>

class Base
{
	public:
		Base *pointer = nullptr;

		virtual void add(Base *element) = 0;
		virtual void print() const = 0;

		template <typename> friend class Element;

	private:
		virtual const std::type_info& getType() const = 0;
};

template <typename T>
class Element : public Base
{
	public:
		Element(T value) : value(value) { }

		virtual void add(Base *element) override
		{
			const std::type_info &type = element->getType();

			if (type == typeid(short))
			{
				value += dynamic_cast <Element <short> *> (element)->value;
			}
			else if (type == typeid(int))
			{
				value += dynamic_cast <Element <int> *> (element)->value;
			}
			else if (type == typeid(long long))
			{
				value += dynamic_cast <Element <long long> *> (element)->value;
			}
		}

		virtual void print() const override
		{
			std::cout << value << std::endl;
		}

		template <typename> friend class Element;

	private:
		T value = 0;

		virtual const std::type_info& getType() const override
		{
			return typeid(T);
		}
};


Имхо очень плохое решение этого вопроса, поскольку в будущем необходимо будет ещё реализовать методы subtract, multiply, divide и типов будет сильно больше: char, float, double и всякие там unsigned.

Прошу посоветовать как лучше реализовать этот метод.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
Wyrd
@Wyrd
Архитектор
Кажется вы ищете паттерн Visitor https://ru.m.wikipedia.org/wiki/Посетитель_(шаблон...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы