Dobrý deň,
Snažím sa implementovať do môjho OOP jazyka overloading operátora []. Jedna z možností je c++ štýl:
//A)
<type> 'operator' '[' ']' '(' [params]... ')' [qualifier]
Problém je ten, že môj jazyk má správu pamäte podobnu c#, takže funkcia nemôže večšinou vracať referenciu, takže takýto operator sa dá požiť len ako getter. Syntax môjho jazyka je odvodena od D (konštruktor sa volá this(), property sa riešia tiež ako v D pomocou atributu @property ) takže vytvoriť property this[] ako v C# sa moc nehodí.
Ďalšie riešenie čo ma napadlo je nasledovné:
//B)
<type> 'operator' '[' [params]... ']' '(' ')' [qualifier] //getter
<type> 'operator' '[' [params]... ']' '(' <param> ')' [qualifier] //setter
//alebo s '=':
<type> 'operator' '[' [params]... ']' '=' '(' <param> ')' [qualifier] //setter
//priklad:
class C{
int[] x;
int operator [ size_t index ] () {return x[index];}
void operator [ size_t index ]( int value) {x[index] = value;} // '=' by tam v podstate ani nemuselo byť
//alebo s '=':
void operator [ size_t index ] = ( int value) {x[index] = value;} // '=' by tam v podstate ani nemuselo byť
}
Toto riešenie sa my zatial najviac pozdava. (je to v podstate C# property this[] s inou syntaxou)
Ďalej ma napadol taký mix C++ a D:
//C)
<type> 'operator' '[' [params]... ']' '(' ')' [qualifier] //getter
<type> 'operator' '[' [params]... ']' <unar_op> '(' ')' [qualifier] //setter, napr obj[index]++,
<type> 'operator' '[' [params]... ']' <bin_op> '(' <param> ')' [qualifier] //setter, napr obj[index]+= tmp; obj[index]= tmp;
//priklad:
class C{
int[] x;
int operator [ size_t index ] () {return x[index];}
void operator [ size_t index ]=( int value) {x[index] = value;}
void operator [ size_t index ]+=( int value) {x[index] += value;}
void operator [ size_t index ]++() {x[index]++;} //toto sa my zda už prehnané
//sem by sa potom hodil daky generator (určituú formu compile time templatov ako v D čo je ďalšia práca navyše lebo planujem mať zaťial len templaty ako v C#, čiže priamo v bytecode)
}
Toto riešenie rozširuje možnosť B) a spája aj iné operátory ako '=' s indexovacím '[]'. Tu mám na vás jednu otázku. Požívate často nasledovný kód:
obj[index] += expr;
obj[index] -= expr;
obj[index] op= expr; //op je iny operator ktory sa da spája s '='.
Či sa vobec oplati zaoberať takymto až "extrémnym" overloadingom.
Prípadne stretli ste sa s inou syntaxou overloadingu operatorov ktorá by sa viac hodila?