027
03.09.2003, 18:54 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zwar ist die Aussage wahr, daß es immer ohne goto geht; allerdings sollte nicht verschwiegen werden, daß dies uU Aufwand bedeutet, wie Pablo andeutet
C++: |
void f() { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if (something()) goto ende; other_stuff(); } otherstuf(); } ende: something_else(); }
|
Gehen wir mal die Alternativen durch (mir sind natürlich auch nicht alle geläufig):
Das Offensichtliche zuerst:
C++: |
void f() { for(int i=0; i<10 &&; ++i) { bool sth_took_place = false; for(int j=0; j<10; ++j) { sth_took_place = something(); if (sth_took_place) break; other_stuff(); } if (sth_took_place) break; otherstuf(); } something_else(); } /* --edit: Korrektur, Besseres Scoping der Locals
|
Direkt einfacher sieht es nicht aus...
Tja, dann
C++: |
class breaker { }; void f() { try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if (something()) throw breaker(); other_stuff(); } otherstuf(); } } catch(breaker&) { } something_else(); }
|
Würde ich rein von der Struktur her bevorzugen; von der Performance jedoch nicht. Wenn man das auch mehrfach verwenden wollte, muß man da ein - hier häßliches Template basteln, sonst besteht die Gefahr, daß man mit breaker-Exeptions aus unterschiedlichen funktionen gemassel bekommt.
C++: |
template<void* p>class breaker { }; void f() { typedef breaker<(void*)f> f_breaker; try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if (something()) throw f_breaker(); other_stuff(); } otherstuf(); } } catch(f_breaker&) { } something_else(); }
|
Super geil wäre natürlich
C++: |
void f() { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if (something()) break(2); other_stuff(); } otherstuf(); } something_else(); }
|
gibt es aber nicht. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 03.09.2003 um 19:02 Uhr von virtual editiert. |