我們有一個類層次結構,看起來是這樣的:相同的功能,不同的返回類型的類層次
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的函數,我將需要其他很多這些模板函數。
類定義的類成員的數據類型是已知的,所以不得不將它們放在函數定義中似乎是重複的。有沒有可能的方法來避免函數定義中的所有這些模板業務?
謝謝。
安迪
PS我已經看到了以下問題,但這個問題的問題是稍有不同: Returning different data type depending on the data (C++)
我同意usinig浮點數學重複乘法/除法是不是一個好主意。這只是一個說明性的例子。事後看來,我可以選擇另一種手術。 – Andy 2009-06-11 15:07:05