diff --git a/research/try.cpp b/research/try.cpp index a2f2d93e2..21e904649 100644 --- a/research/try.cpp +++ b/research/try.cpp @@ -61,6 +61,7 @@ typedef unsigned int uint; #include "lib/format-cout.hpp" #include "lib/test/test-helper.hpp" #include "lib/util.hpp" +#include "lib/verb-visitor.hpp" #include "lib/meta/variadic-helper.hpp" @@ -68,6 +69,7 @@ typedef unsigned int uint; #include #include +using lib::Literal; using std::string; using std::tuple; @@ -91,11 +93,11 @@ forwardInvoker (FUN& fun, ARGS&&... args) template struct Holder { - using Tup = tuple; + using Args = tuple; - Tup tup; + Args tup; - Holder (Tup& tup) + Holder (Args& tup) : tup{tup} { } @@ -104,7 +106,7 @@ void unpack_and_forward (FUN& fun, lib::meta::IndexSeq) { cout << "unpack_and_forward...\n"; - SHOW_TYPE (Tup) + SHOW_TYPE (Args) forwardInvoker (fun, std::get (tup)...); } @@ -113,7 +115,7 @@ void applyTuple (FUN& fun) { cout << "applyTuple...\n"; - SHOW_TYPE (Tup) + SHOW_TYPE (Args) using SequenceIterator = typename lib::meta::BuildIdxIter::Ascending; @@ -135,7 +137,7 @@ applyTuple (FUN& fun) } ~Trackr() { - cout <<"~Trackr()"< buggy; +// return verb_.applyTo (receiver, std::get (std::forward(args_))...); /// <<------------this compiles, but consumes the tuple's content (move init) +// return verb_.applyTo (receiver, std::get (args_)...); +// return (receiver.*handler_)(std::get (args_)...); /// <<------------this works +// return applyToVerb (receiver, std::get (args_)...); +// return getVerbFun(receiver) (std::get (args_)...); /// <<------------this compiles, but creates a spurious copy + return verb_.applyTo (receiver, forwardElm (args_)...); /// <<------------this compiles, but consumes the tuple's content (move init) + } + + template + using TupleElmType = typename std::tuple_element::type; + + template +// std::remove_reference_t (args))>&& + TupleElmType&& + forwardElm (Args& args) + { + using ElmRef = decltype(std::get (args)); + using Elm = std::remove_reference_t>; + + return std::forward> (std::get (args)); + } + + RET + applyToVerb (REC& receiver, ARGS&& ...args) + { +// REQUIRE ("NIL" != token_); + return (receiver.*handler_)(std::forward(args)...); + } + +// std::function + decltype(auto) + getVerbFun(REC& receiver) + { + return [&](ARGS...args) -> RET + { + return (receiver.*handler_)(std::forward(args)...); + }; + } + }; + int main (int, char**) @@ -172,15 +259,21 @@ main (int, char**) holder.applyTuple (fun); - auto trp = std::make_tuple(2u,Trackr(3)); + uint zwo{2}; + std::tuple trp{zwo,Trackr(3)}; auto frn = [](uint& x, Trackr y) { cout << x<<"*Trckr("<; + using Hrl = Holder; Hrl hrlder(trp); hrlder.applyTuple (frn); + cout << "\n.ulps.\n"; + Hodler holyh(&Receiver::grrrn, "holyhandgrenade", zwo, Trackr(5)); + Receiver recy; +// recy.grrrn (std::get<0>(trp), Trackr(5)); + holyh.applyTo (recy); cout << "\n.gulp.\n"; return 0; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 4f84f5b9f..74c0bd02e 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -19126,8 +19126,7 @@ weil ein Layout-Manager immer nur im Bereich eines TimelineWidget relevant ist

- - + @@ -19526,8 +19525,7 @@ Unterscheidung verschoben in die Darstellung

- - + @@ -19546,8 +19544,7 @@ zur Anwendung kommt

- -
+
@@ -19575,8 +19572,7 @@ Problem: muß immer sichtbar sein

- - + @@ -19597,8 +19593,7 @@ am Anfang des Track-Profils, welche immer sichtbar bleiben soll

- -
+
@@ -19632,8 +19627,7 @@ stets besser ist, als repetitives aufdoppeln und variieren

- - +
@@ -19653,8 +19647,7 @@ - - + @@ -19708,8 +19701,7 @@ und daher nicht a priori die Liste aller einzubettenden Varianten kenne

- - +
@@ -19729,8 +19721,7 @@ nämlich hier der Visitor, der den Aufruf letztlich emfpängt

- - +
@@ -19780,8 +19771,7 @@ Au weia

- - +
@@ -19812,8 +19802,7 @@ d.h. std::get<idx> (std::forward<TUP> (tuple))

- - +
@@ -19825,8 +19814,7 @@ wenn ich das Tupel als Referenz anliefere

- -
+
@@ -19859,19 +19847,61 @@ der betreffende Wert dann RValue-Initialisiert wird, d.h. dabei das betreffende Tupel-Element konsumiert

- - +
- + + + + + + + + +

+ d.h er funktioniert nur, wenn man das std::get<idx> (tuple) unmittelbar an den jeweiligen Ziel-Parameter bindet +

+ + +
+ + + + + + +

+ nämlich einen, der einen LValue entgegennimmt +

+

+ und einen, der einen RValue entgegennimmt +

+ + +
+
+ + + + + +
+
+
+ + + + + + @@ -19899,8 +19929,7 @@ daß der Compiler verucht, den Zuweisungsoperator zu verwernden!

- - +
@@ -19915,8 +19944,7 @@ nämlich diejenige für Typen ohne Support auf dem API.

- - +
@@ -19954,8 +19982,7 @@ VerbPack-Typ konstruiert zu bekommen.

- - +
@@ -19967,8 +19994,7 @@ d.h. man erzeugt in einem einzigen Aufruf den VerbPack für eine Zielfunktion

- -
+
@@ -20000,8 +20026,7 @@ von denen der zweite, innere die eigentliche Typinferenz macht

- - +
@@ -20023,8 +20048,7 @@ sollten z.B. die Konstruktor-Funktionen nicht unmittelbar mit definiert werden?

- - +
@@ -20039,8 +20063,7 @@ Wie auch im konkreten Fall das TrackProfile, was dann ein vector<VerbPack> werden würde?

- -
+
@@ -20064,8 +20087,7 @@ grundsätzlich: es zeichnet der Canvas

- - + @@ -20109,8 +20131,7 @@ das ist ein reiner (pesistent) presentation state

- - +
@@ -20250,8 +20271,7 @@ wir können nicht von 0 bis MAXINT zeichnen

- - +
@@ -20319,8 +20339,7 @@ ...zum Beispiel um einen "Wall" auch expressiv zu schattieren

- - +
@@ -20364,8 +20383,7 @@ wenn er mit der HeaderPane den benötigten Platz aushandelt

- - + @@ -22212,8 +22230,7 @@ where 1 tick unit depends on the current zoom level

- - +