Wie erstelle ich eine saubere kaskadierende Struktur in C ++?

8

Ich benutze die Regex-Bibliothek von Boost, und ich stelle fest, dass festgestellt wird, ob eine benannte Übereinstimmung gefunden wird, und dass die Verwendung dieser Information dann etwas nervig ist. Um ein benanntes Spiel zu finden, möchte ich Folgendes tun:

%Vor%

Wenn das funktionieren würde, wäre das großartig. Das Scoping wäre auf den Körper des If beschränkt, Speicher kann effizient genutzt werden und sieht ziemlich sauber aus. Leider funktioniert es nicht, da Sie keine Variable in einer Liste definieren können. : (

Dies könnte eine Möglichkeit gewesen sein:

%Vor%

Aber match_t ist eine Const-Referenz, daher ist sie nicht zuweisbar. (tl; dr Außerdem weiß ich nicht, was der zugrunde liegende Typ ist und im Allgemeinen möchte ich nicht wirklich wissen, da ich eine allgemeinere Lösung vorziehen würde, die ich außerhalb dieses einen Beispiels von Regex verwenden könnte std :: move () wurde verwendet, um [...] es wird noch ausführlicher und die Dokumentation sagt nicht, dass es move-Semantik für sub_match verwendet. All dies ist natürlich aus dem Grund, der in der ersten gegeben Satz dieses Absatzes.)

Eine andere Möglichkeit ist zu tun:

%Vor%

Was ich wegen der tiefen Verschachtelung von Zahnspangen nicht mag.

Vielleicht missbrauchen Sie eine Schleifenstruktur mit break s am Ende jedes if body wie folgt:

%Vor%

Was ist besser, aber immer noch nicht großartig. Mit Makros könnte ein Großteil des Rauschens nicht sichtbar sein. Wie:

%Vor%

Die Klammern werden eigentlich von den Makros impliziert, aber sie erleichtern das Lesen, indem sie wiederholt werden.

Eine andere Option, die ich mir vorstellen kann, ist, in die boost :: sub_match-Klasse zu gehen und eine Konvertierungsfunktion hinzuzufügen, um diesen Typ in einen bool umzuwandeln, dessen Rückgabewert der von matched -Member wäre. Dann könnte ich im if-Ausdruck eine match_t-Variable deklarieren, die automatisch vom if in einen booleschen Wert umgewandelt würde. Ich bin mir nicht sicher, ob ich schon da bin und es ist nicht generisch.

Stilistisch sind diejenigen, die ich gut oder schlecht vorschlage (nur die letzten 3 funktionieren tatsächlich, also würde ich wahrscheinlich Kommentare auf sie beschränken).

Hat auch jemand bessere Vorschläge? Bitte geben Sie an, warum Sie denken, dass sie besser sind.

    
Adrian 24.05.2013, 05:09
quelle

3 Antworten

5

Es wird generell empfohlen, verschachtelte if s zu vermeiden - sie machen den Code schwerer lesbar. Wenn verschachtelt ist, sollte es wahrscheinlich durch einen Funktionsaufruf ersetzt werden.

In Ihrem Fall müssen Sie eine Schleife verwenden.

Ihr zweites Beispiel:

%Vor%

BEGS für eine Schleife:

%Vor%

Alle anderen Beispiele (IMO) sind ein schlechter Codierungsstil. Ich bevorzuge es, Schleifen und IFS kurz zu halten. Wenn es nicht in 20 Zeilen Code passt, dann ist es besser, etwas sehr Kompliziertes zu tun (was nicht Ihr Fall ist). Wenn es nichts kompliziertes tut, muss es neu strukturiert werden.

    
SigTerm 24.05.2013, 15:28
quelle
3

Sie könnten so etwas tun (beachten Sie, dass dieser Code nicht gegen einen Compiler getestet wird)

%Vor%     
Marius Bancila 24.05.2013 05:30
quelle
0

Sie können einen Umbruch von match_t mit einer Überladung von operator bool :

schreiben %Vor%

Und dann:

%Vor%

Für zusätzliche Punkte können Sie auch operator-> :

überladen %Vor%     
rodrigo 24.05.2013 15:09
quelle

Tags und Links