2012-03-21 31 views
4

在C++中創建一個通用的Numeric類的最佳方法是什麼?我在考慮一個可以包含整數,浮點數和雙精度的對象。在C++中創建一個通用的Numeric類

我的第一個想法是使用將用於Numeric類中的聯合,您可以在其中定義每種類型的允許操作。例如:

union mixed_number{ 
    int a; 
    float b; 
    double c; 
}; 

class Number{ 
    //define operations 
    ... 
}; 

請讓我知道是否有更好的方法。

+0

候選人更好的方法:只需使用'雙'。假設的Numeric類的優點是什麼? – Jon 2012-03-21 17:52:07

+0

哦,當你說泛型時,我認爲你的意思是仿製藥......無論如何,爲什麼?你想寫一個JavaScript解釋器或類似的東西? – 2012-03-21 17:53:29

+0

是的,我想寫一個小解釋器,同時我想了解像Python和Ruby這樣的動態語言如何定義他們的數據。我知道我可以查看源代碼,但我想先嚐試一些想法。 – mmisu 2012-03-21 17:56:32

回答

5

前段時間我做了一個通用的Numeric類。這裏:

/** @author Muhammad Ahmad Tirmazi **/ 
template< typename T> class TypeWrapper 
{ 
    T value; 
public: 
    TypeWrapper(T v): value(v) {} 

    operator T() { return value; } 

    // basic arithmetic operators 
    void operator = (T v){ value = v; } 

    TypeWrapper operator + (T v) { return TypeWrapper(value + v); } 
    TypeWrapper operator - (T v) { return TypeWrapper(value - v); } 
    TypeWrapper operator * (T v) { return TypeWrapper(value * v); } 
    TypeWrapper operator/(T v) { return TypeWrapper(value/v); } 
    TypeWrapper operator % (T v) { return TypeWrapper(value % v); } 

    void operator += (T v) { value += v; } 
    void operator -= (T v) { value -= v; } 
    void operator *= (T v) { value *= v; } 
    void operator /= (T v) { value /= v; } 
    void operator %= (T v) { value %= v; } 

    T operator ++() { return ++value; } 
    T operator --() { return --value;} 
    T operator ++ (int v) { return value++; } 
    T operator -- (int v) { return value--; } 

    // conditions 
    bool operator == (T v) { return value == v; } 
    bool operator != (T v) { return value != v; } 
    bool operator > (T v) { return value > v; } 
    bool operator < (T v) { return value < v; } 
    bool operator >= (T v) { return value >= v; } 
    bool operator <= (T v) { return value <= v; } 

    T toPrimitive() { return value; } 
    string toString() 
    { 
     stringstream ss; 
     string rtn; 

     ss << value; 
     ss >> rtn; 

     return rtn; 
    } 
}; 

// just to make things easier for a future move. 
#define NumericTypeWrapper TypeWrapper 

    typedef NumericTypeWrapper<int> Integer; 
    typedef NumericTypeWrapper<double> Double; 
    typedef NumericTypeWrapper<float> Float; 
} 
+0

這是絕對不正確的課!例如bool operator ==(T v){return value == v; }不「工作」雙。 – innochenti 2012-03-21 17:54:21

+1

我不認爲OP意味着模板與「通用」。 – 2012-03-21 17:55:57

+1

@MrLister哦,該死的。那他是什麼意思?很抱歉對於這個誤會。 – ApprenticeHacker 2012-03-21 17:56:54