Erzwinge all && ausgeführt werden?

8

Betrachten Sie die folgende variadic Funktion

%Vor%

Wenn eine Rekursionsstufe false ist, dann vermute ich, dass das Folgende nicht ausgeführt wird. Gibt es einen Trick, um die Rekursion für alle Argumente zu erzwingen, selbst wenn einer von ihnen false zurückgibt?

    
Vincent 23.03.2013, 15:01
quelle

5 Antworten

21

Das sollte nicht zu schwer sein:

%Vor%     
Andy Prowl 23.03.2013, 15:02
quelle
11

Da sich die Debatte in einem Vergleich der AndyProwl- und Alon-Lösung entwickelt hat, habe ich beide Lösungen verglichen, und das Ergebnis ... hängt von der Anzahl der Argumente ab.

Kompilieren mit:

%Vor%

bewertet die AndyProwl-Lösung und kompiliert mit:

%Vor%

bewertet die Alon-Lösung.

Hier ist das Programm des Benchmarks für 10 Argumente.

%Vor%

Bei 50 Benchmarks für jede Lösung mit einer gegebenen Anzahl von Argumenten ist die Streuung sehr klein und die mittlere Zeit über diesen Benchmarks ist ein zuverlässiger Indikator.

Mein erster Benchmark war die "richtige" Anzahl von Argumenten, bei denen die Alon-Lösung schneller ist als die AndyProwl-Lösung.

Die Endergebnisse sind hier:

Also ist die AndyProwl-Lösung im Allgemeinen schneller als die Alon-Lösung. So, jetzt kann ich deine Antwort bestätigen. Aber ich denke, dass der Unterschied so klein ist, dass es von Architektur / Compiler abhängig ist.

Also:

  • AndyProwl + 1 für Ihre allgemein schnellere Lösung
  • Alon + 1 für Ihre consitexpr-fähige Lösung
Vincent 23.03.2013 18:17
quelle
4

Sie können sie separat ausführen und einen bool-Ausdruck zurückgeben:

%Vor%     
Mohamad Ali Baydoun 23.03.2013 15:03
quelle
4

Ohne Rekursion:

%Vor%     
ipc 23.03.2013 15:06
quelle
-1

Es gibt einen viel schöneren Trick, anstelle von & amp; & amp; zwischen allen Funktionen verwenden Sie einfach ein & amp;

static_cast<bool>(f(arg)) & static_cast<bool>(f2(args)) ... wird unabhängig vom Ergebnis alle Operationen ausführen:)

    
Alon 23.03.2013 15:07
quelle