оператор перегрузки [] для неклассного типа - PullRequest
2 голосов
/ 06 марта 2012

Мне интересно, есть ли способ перегрузить оператор [] для неклассного типа в C ++.

По существу, существует тип данных, который является указателем (CFDictionaryRef from CoreFoundation).Но это не класс (я знаю, что перегрузка оператора [] для определенного класса разрешена).Я знаю, как получить доступ к каждому элементу внутри CFDictionaryRef (например, с помощью CFDictionaryGetIndex (индекс CFIndex);).Я хочу упростить его, чтобы мне не приходилось каждый раз писать этот вызов функции.Я хочу перегрузить оператор [] для CFDictionaryRef.Но так как это не класс, из того, что я вижу, это невозможно.

Кто-нибудь получил какие-либо предложения?

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Вы правы, невозможно перегрузить операторы для типов, не определенных пользователем.

Что вы можете сделать, это заключить указатель в класс и перегрузить операторы самого класса. Поскольку вы можете перегружать операторы только для типов классов, это единственный вариант.

class CFDictionaryRefWrapper {
public:
    CFDictionaryRefWrapper(CFDictionaryRef r) : dref(r) { }

    CFDictionaryRef dref;

    Type operator[](unsigned int index) {
        /* do whatever with dref */
    }
};

Это также имеет преимущество, заключающееся в возможности автоматического управления временем жизни указателя (RAII), если вам нужно это сделать.

1 голос
/ 06 марта 2012

Нет, вы не можете перегрузить оператор [] для типа указателя или любого другого встроенного типа.Фактически, ptr[N] уже является сокращением для *(ptr + N).

. Вам нужно определить свой собственный класс, который обернет указатель, если вы хотите перегрузить оператор [].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...