用C++创建一个通用的Numeric类

mmi*_*isu 5 c++

在C++中创建通用Numeric类的最佳方法是什么?我正在考虑一个可以包含整数,浮点数和双精度的对象.

我的第一个想法是使用将在Numeric类中使用的union,您可以在其中定义每种类型的允许操作.就像是:

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

class Number{
    //define operations
    ...
};
Run Code Online (Sandbox Code Playgroud)

如果有更好的方法,请告诉我.

App*_*ker 5

我刚才做了一个通用的数字课.这里:

/** @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;
}
Run Code Online (Sandbox Code Playgroud)