У нас есть иерархия классов, которая выглядит примерно так:
class base
{
};
class derived1 : protected base
{
private:
float m_price;
int m_quantity;
float m_value;
public:
// float calculateValue();
};
class derived2 : protected base
{
private:
double m_price;
long m_quantity;
double m_value;
public:
// double calculateValue();
};
Теперь нам нужно написать функцию, которая вычисляет значение путем умножения цены и количества. Цель состоит в том, чтобы максимально упростить добавление новых классов в будущем. Как вы, возможно, знаете, это не так просто, потому что типы данных этих полей различны для разных классов. По сути, у нас есть эти функции для концептуального выполнения одного и того же, но в терминах программирования это разные операции.
Чтобы свести к минимуму необходимое количество вырезок и вставок, решение, которое я могу себе представить, заключается в использовании шаблонных функций:
template <class A, B, C>
A calculate_value(B price, C quantity)
{
A result;
// Some code to do the multiplication, not sure if template specialisation is needed
return result;
};
class derived1 : protected base
{
private:
float m_price;
int m_quantity;
float m_value;
public:
float calculateValue()
{
calculate_value < float, float, int > (m_price, m_quantity);
}
};
Он хорошо выполняет свою работу, но это будет означать, что мне нужно определить каждую функцию-член в каждом классе. Например, мне понадобится еще много таких шаблонных функций, если я хочу иметь функцию getValue, скажем.
Типы данных членов класса известны, когда класс определен, поэтому необходимость их повторного включения в определения функций представляется дублированием. Есть ли возможный способ избежать всего этого бизнес-шаблонов в определениях функций?
Спасибо.
Andy
PS Я видел следующий вопрос, но проблема в этом вопросе немного отличается:
Возвращает другой тип данных в зависимости от данных (C ++)