Anwenden einer Funktion auf jedes Element eines Tupels

8

Bei einem std::tuple -like Objekt (also mit definierter% semantischer tuple_size und get ) und einem unären Funktorobjekt ftor möchte ich ftor für jedes Element von% co_de aufrufen können % -ähnliches Objekt.

Wenn ich den Rückgabewert ignoriere, bin ich mir des Int-Array-Tricks bewusst:

%Vor%

Wenn ich die Rückgabewerte haben möchte, könnte ich stattdessen den tuple Trick durch einen Aufruf von int [] ersetzen und diesen zurückgeben. Das würde funktionieren, vorausgesetzt, dass keiner der Aufrufe des Objekts std::make_tuple einen ftor Rückgabewert hat ...

Die Frage, die ich habe, ist daher: Wenn ich die Ergebnisse des Aufrufs sehen möchte, wie kann ich Aufrufe behandeln, die void zurückgeben?

Die einzige Voraussetzung ist, dass ich die Ergebnisse als Tupel erhalten soll und in der Lage sein soll, zu bestimmen, welcher Aufruf zu welchem ​​Element des Ergebnistupels führt.

    
Rerito 07.11.2017, 09:11
quelle

2 Antworten

2

Ein anderer Weg:

%Vor%

Im obigen Beispiel wird operator, auf das Ergebnis von ftor und apply_unary_helper_t angewendet. Wenn das Ergebnis von ftor void ist, dann ist r std::initializer_list<details::apply_unary_helper_t> , andernfalls r ist std::initializer_list<decltype(ftor(...))> , das Sie verwenden können.

    
Maxim Egorushkin 07.11.2017, 10:41
quelle
4

Wie von @ Jarod42 vorgeschlagen, wird das Umbrechen des Aufrufs mit einer zusätzlichen Ebene, die dafür sorgt, dass void return durch eine Dummy-Struktur ersetzt wird, der Trick sein:

%Vor%

Eine Live-Demo ist verfügbar auf Coliru

Ich habe dies mit SFINAE getan, um zwischen den beiden Überladungen zu unterscheiden. Es sieht irgendwie hässlich aus, wenn du Verbesserungsvorschläge hast ... Ich bin ganz Ohr!

    
Rerito 07.11.2017 09:38
quelle

Tags und Links