2015-07-27 2 views
-6

Я хочу создать объект BigInteger (для практики). Я хочу, чтобы перегруженные операторы принимали любые числовые типы данных. Я могу сделать это полиморфно, но так как это было бы нецелесообразно перегружать 20+ бинарных операторов для каждого из 20 ~ числовых типов, я действительно хотел бы сделать что-то вроде этого:общий номер в C++

X & operator+(const anynum input) 
{ 
    return this->value += input; 
} 

... 
main() 
{ 
    X a = 1; 
    a = a + 1; 
    a = a + 1L; 
} 

извините, мой вопрос : "Это возможно"?

Я исследовал эту большую часть прошлой ночи. Я прочитал запись о перегрузке оператора на cpp.com, список перегружаемых операторов на wikipedia, различные сообщения о переполнении стека.

+9

я не заметил вопрос. Вы рассматривали шаблоны? –

+0

Вместо того, чтобы писать двоичные операторы для каждой возможной пары, почему бы не написать один двоичный оператор для bigint + bigint, а затем заставить операторов преобразования преобразовать из других числовых типов в bigint? –

+0

лицоpalm. Ага. Это было слишком долго, так как я сделал C++. @tripl_r опубликуйте это как ответ, и я его выберу. – chrisgotter

ответ

0

Возможно через несколько иные средства. Смотрите пример:

#include <iostream> 

class X 
{ 
public: 
    X(int val) : 
      value(val) 
    { 

    } 
// this is the important part 
    template<class TYPE> 
    X & operator+(TYPE input) 
    { 
     value += input; // just demonstrating with a simple int 
         // a real bignum will be significantly more complex 
         // and you may well find that one function does not fit all cases 
         // for your particular bignum implementation 
     return *this; 
    } 
// end of important part 
    void print() 
    { 
     std::cout << value << std::endl; 
    } 
private: 
    int value; 
}; 

int main() 
{ 
    short s = 1; 
    unsigned short us = 1; 
    int i = 1; 
    long l = 1; 
    long long ll = 1; 
    float f = 1.0; 
    double d = 1.0; 
    X a(1); 
    a.print(); 
    a + 1; // templated function is automatically implemented by compiler 
      // for the data type in the call. Use all the data types you want. 
      // The compiler will make one for each one used. 
    a.print(); 
    a + 1L; 
    a.print(); 
    a + 1.0; 
    a.print(); 
    a + s; 
    a.print(); 
    a + us; 
    a.print(); 
    a + i; 
    a.print(); 
    a + l; 
    a.print(); 
    a + ll; 
    a.print(); 
    a + f; 
    a.print(); 
    a + d; 
    a.print(); 
// a + "Hi!"; Ka BOOOOOM! Cant add a string to an integer 
    a + 'A'; // it does, however, allow this through because math on characters 
      // is a time-honoured tradition. 
    a.print(); 
} 

Для полноты, вот вывод:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
76 
+0

интересный, по какой-то причине я думал, что это не сработает, мне придется попробовать, хотя – chrisgotter

Смежные вопросы