Pergunta

I têm uma classe C ++ que sobrecargas operator[], o índice de matriz / Suportes operador. Isto é terrivelmente fora conveniente de minha classe, onde eu posso escrever foo[bar]. No entanto, eu não consigo descobrir como usar esta notação quando eu estou implementando métodos dentro minha classe.

Eu sei que eu posso escrever operator[](bar) ou this->operator[](bar) mas aqueles são bastante complicado e tirar um monte de conveniência do operador em primeiro lugar. (Eu também sei que posso basta adicionar um novo método que chama o operador.) Existe uma maneira que eu posso escrever this[bar] ou this->[bar] ou algo semelhante bom?

Nota :. Esta questão pode também se aplicam aos muitos operadores unários (? Por exemplo, como posso chamar foo++ de dentro da classe), mas eu pessoalmente só se preocupam com operator[]

Editar : Eu percebi logo após a postagem que eu possa usar (*this)[bar]. Todas as respostas até agora sugerem isso também. Existem outras alternativas?

Foi útil?

Solução

(*this)[bar];

funciona bem para mim.

Outras dicas

Uma alternativa para (*this)[bar] é usar uma função membro nomeado que faz o trabalho de operator[]. operadores sobrecarregados facilitar as coisas para os usuários. Mais importante, eles fazem parte de sua classe Interface . Pergunte a si mesmo se ele realmente faz sentido para implementar sua classe em termos de sua própria interface pública. Se não, eu sugiro escrever uma função membro separado (protegida ou privada) para fazer o trabalho, e depois ter operator[] e qualquer outra chamada de função-lo.

Eu uso um no function (), e tem o operador [] chamar a função de (), nos bastidores, de modo operador [] é apenas açúcar sintático. Isso é como std :: vector não é, por isso parece ser uma maneira razoável (com precedência) para fazê-lo.

Agora, para um hack açúcar sintático completo (não posso dizer que recomendo totalmente, mas pode greve sua fantasia):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

Além disso, se você quiser fazer isso de graça, sem pagar o custo da referência, E é um seguidor de alguma seita mal dedicada a tornar programadores sofrem você poderia fazer:

#define self (*this)

Na verdade, eu acho que é como a maioria das alças são implementados no NS API da Apple ...

Use

(*this)[bar]

para chamar a operator[] do objeto instância.

trata this[bar] o ponteiro this como uma matriz e os índices a bar-th elemento da matriz que (voltando uma referência de objecto susceptível-inválido).

Você pode usar (* this) [bar] , mas que pode não ser muito de uma melhoria ...

 operator[](bar) 

Isso deve funcionar também. Ele funciona para mim!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top