Immaginiamo di avere una struttura per contenere 3 doppie con alcune funzioni membro:
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
Questo è un po 'artificioso per semplicità, ma sono sicuro che sei d'accordo sul fatto che un codice simile sia disponibile. I metodi ti consentono di concatenare comodamente, ad esempio:
Vector v = ...;
v.normalize().negate();
O anche:
Vector v = Vector{1., 2., 3.}.normalize().negate();
Ora, se fornissimo le funzioni begin () e end (), potremmo usare il nostro Vector in un nuovo stile del ciclo for, ad esempio per eseguire il ciclo sulle 3 coordinate x, yez (senza dubbio puoi costruire esempi più "utili" sostituendo Vector con es. String):
Vector v = ...;
for (double x : v) { ... }
Possiamo anche fare:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
e anche:
for (double x : Vector{1., 2., 3.}) { ... }
Tuttavia, il seguente (mi sembra) non funziona:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
Anche se sembra una combinazione logica dei due usi precedenti, penso che quest'ultimo utilizzo crei un riferimento penzolante mentre i due precedenti sono completamente a posto.
- È corretto e ampiamente apprezzato?
- Quale parte di quanto sopra è la parte "cattiva", che dovrebbe essere evitata?
- Il linguaggio sarebbe migliorato cambiando la definizione del ciclo for basato su intervallo in modo tale che i provvisori costruiti nell'espressione for esistano per la durata del ciclo?