On stackoverflow I asked, what is the preferred way to expose custom STL-style iteration?
... In C#, I can do about the same with just a single function using yield return
No, davvero non puoi.
Il yield return
di C # è simile a un generatore Python, che in termini C ++ è un InputIterator , la più semplice delle sei categorie di iteratori descritte qui .
La tua domanda originale implementa un RandomAccessIterator , che è significativamente più potente di questo - per esempio, tu può eseguire la ricerca binaria diretta ad accesso casuale sugli iteratori restituiti in quel codice o ordinare i contenuti di un contenitore non const sul posto.
Se tutto ciò che vuoi è un iteratore di input in stile C # / Python, puoi probabilmente semplificare la produzione con CRTP come suggerito da Cort Ammon nei commenti, e puoi sicuramente perdere i sovraccarichi non costanti.
Un riepilogo dei commenti successivi:
Q: In PogoStickLang, I can create a new pogo stick by just typing !
. In RocketLang I need to type loads more stuff to make a pogo stick, and it seems over-complex
A: In RocketLang you created a rocket, which is why it's more complex than a pogo stick. Either
- create a pogo stick if that's all you want. It's more work when not using a language tightly focused on the unique needs of pogo stick-users, but still less work than creating a rocket
- or, create a rocket and actually take advantage of all the things it can do that a pogo stick can't, like flying to the moon or incinerating your enemies.
No, non è del tutto serio. No, non sto suggerendo che C # sia un linguaggio giocattolo, e no, non sto suggerendo che questo sia un confronto proporzionato dei poteri relativi di Input- e RandomAccessIterators. Non ho nulla contro i pogo stick e raramente, se non mai, incenerisco i miei nemici .