在C++中创建一个通用的数字类

6
什么是在C++中创建通用Numeric类的最佳方法? 我想到了一个对象,可以包含整数、浮点数和双精度浮点数。
我的第一个想法是使用一个联合体,该联合体将在Numeric类中使用,在其中可以为每种类型定义允许的操作。就像这样:
union mixed_number{
    int a;
    float b;
    double c;
};

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

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


更好的方法候选者:只需使用double。 与此相比,假设的“Numeric”类有什么优势? - Jon
哦,当你说泛型时,我以为你是指通用类型...不管怎样,为什么呢?你想写一个JavaScript解释器或类似的东西吗? - Mr Lister
是的,我想编写一个小的解释器,同时我也在试图理解像Python和Ruby这样的动态语言如何定义它们的数据。我知道我可以查看源代码,但我想先尝试一些想法。 - mmisu
1个回答

6
我之前制作了一个通用的数字类,如下所示:

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;
}

这是绝对不正确的类!例如,bool operator == (T v) { return value == v; } 对于double类型就不能“工作”。 - innochenti
1
我认为OP并不是指“通用”的模板。 - Mr Lister
1
@MrLister 哦,该死。那他的意思是什么?对于误解我感到抱歉。 - ApprenticeHacker
@IntermediateHacker OP想要编写一个小型解释器,并尝试理解Python和Ruby这样的动态语言如何定义它们的数据。他知道可以查看源代码,但他想先尝试几个想法。 - Mr Lister
@mmisu 哎呀,你的个人资料没有提到你的性别。对于任何误解,我表示抱歉。 - Mr Lister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接