2013-09-12 3 views
3

У меня есть следующий класс:объекта в качестве индекса массива

class MyInteger 
{ 
private: 
    __int64 numero; 

    static __int64 int64Pow(__int64, __int64); 
public: 
    // It doesn't matter how these methods are implemented 
    friend class MyInteger; 
    MyInteger(void); 
    MyInteger(const MyInteger&); 
    MyInteger(const __int64&); 
    ~MyInteger(void); 

    static MyInteger const minValue; 
    static MyInteger const maxValue; 

    MyInteger& operator = (const MyInteger&); 
    MyInteger operator + (const MyInteger&) const; 
    MyInteger operator - (const MyInteger&) const; 
    MyInteger operator * (const MyInteger&) const; 
    MyInteger operator/(const MyInteger&) const; 
    MyInteger& operator += (const MyInteger&); 
    MyInteger& operator -= (const MyInteger&); 
    MyInteger& operator *= (const MyInteger&); 
    MyInteger& operator /= (const MyInteger&); 
    MyInteger operator % (const MyInteger&) const; 
    MyInteger& operator %= (const MyInteger&); 
    MyInteger& operator ++(); 
    MyInteger operator ++ (int); 
    MyInteger& operator --(); 
    MyInteger operator -- (int); 
    bool operator == (const MyInteger&) const; 
    bool operator != (const MyInteger&) const; 
    bool operator > (const MyInteger&) const; 
    bool operator < (const MyInteger&) const; 
    bool operator >= (const MyInteger&) const; 
    bool operator <= (const MyInteger&) const; 

    int toStdInt() const 
    { 
     return (int)numero; 
    } 
    float toStdFloat() const; 
    double toStdDouble() const; 
    char toStdChar() const; 
    short toStdShortInt() const; 
    long toStdLong() const; 
    long long toStdLongLong() const; 
    unsigned int toStdUInt() const; 
    __int64 toStdInt64() const; 
    unsigned __int64 toStdUInt64() const; 
    unsigned long long int toStdULongLong() const; 
    long double toStdULongDouble() const; 

    template<class Type> 
    Type& operator[](Type* sz) 
    { 
     return sz[toStdULongLong()]; 
    } 
}; 

template<class Type> 
Type* operator+(const Type* o1, const MyInteger& o2) 
{ 
    return ((o1) + (o2.toStdInt())); 
} 

Я хотел бы использовать этот класс для доступа к элементам массива, как это:

MyInteger myInt(1); 
int* intPtr = (int*)malloc(sizeof(int) * N); 
intPtr[myInt] = 1; 

Я думал, что функция

template<class Type> 
Type* operator+(const Type* o1, const MyInteger& o2) 
{ 
    return ((o1) + (o2.toStdInt())); 
} 

может решить мою проблему, потому что, как сообщает этот пост (Type of array index in C++) "Выражение E1 [E2] является iden (по определению) в * ((E1) + (E2)) ", но я получаю ошибку C2677 ('[' operator: глобальный оператор не найден, который принимает тип« MyInteger »(или нет приемлемого преобразования))

Может ли кто-нибудь прояснить мне эту ситуацию? Благодаря

+0

[ 'станд :: unordered_map'] (HTTP: // эн. cppreference.com/w/cpp/container/unordered_map)? –

+0

@JoachimPileborg Спасибо за ответ, но это не то, что я ищу –

ответ

3

Вы можете быть в состоянии сделать это, перекрывая приведение к int вашего класса MyInteger в аналогично:

class MyInteger { 
    ... 

    operator int() const 
    { 
     return toStdInt(); /** Your class as an array index (int) */ 
    } 

    ... 
} 
+0

Я уже пробовал, но когда я делаю что-то вроде 'MyInteger i (0); i + 1; ' Я получаю ошибку C2666:« MyInteger :: operator + »: 2 перегрузки имеют похожие преобразования –

+0

На самом деле я не думаю, что вам нужно переопределить все математические операторы, вы можете просто переопределить приведение к целому числу и двоичные операторы должны работать автоматически. Возможно, я ошибаюсь. – Lake

+1

Это ** не ** актерский состав. Это ** оператор преобразования **. Бросок - это то, что вы пишете в исходном коде, чтобы сообщить компилятору сделать преобразование. –

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