2012-03-21 4 views
4

C++で汎用Numericクラスを作成する最良の方法は何ですか?私は、整数、浮動小数点数、倍精度を含むことができるオブジェクトを考えています。C++で汎用Numericクラスを作成する

私の最初のアイデアは、各タイプに対して許可された操作を定義できるNumericクラスで使用される共用体を使用することです。次のようなもの:

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

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

もっと良いアプローチがあるかどうか教えてください。

+0

「double」を使用するとよいでしょう。これに対して、仮説的な 'Numeric'クラスの利点は何でしょうか? – Jon

+0

ああ、あなたがジェネリックを言ったとき、あなたはジェネリック薬を意味すると思った...とにかく、なぜ?あなたはジャバスクリプトインタプリタかそのようなものを書いてみたいですか? –

+0

はい、私は小さなインタプリタを書くと同時に、PythonやRubyのような動的言語がデータをどのように定義しているかを理解しようとしています。私はソースコードを見ることができますが、最初にいくつかのアイデアを試してみたいと思います。 – mmisu

答えて

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){戻り値== v; }は二重には機能しません。 – innochenti

+1

OPは "generic"のテンプレートではないと思います。 –

+1

@MrListerオハイオ州。それで彼はどういう意味ですか?誤解をおかけして申し訳ありません。 – ApprenticeHacker

関連する問題