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.
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.
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!