Funktionale Komposition mit verschiedenen Templates in C ++ 11

Ich bin ein Mathematiker, der es schon lange gewohnt ist, C ++ - Programme im "alten Stil" zu programmieren. Ich bin der Meinung, dass einige neue syntaktische Konstruktionen, die von C ++ 11 angeboten werden, mir helfen könnten, einen besseren Code für meine beruflichen Projekte zu erzielen. Da ich jedoch kein CS-Profi bin, muss ich zugeben, dass ich nicht über das nötige Wissen verfüge, um einige Beispiele zu verstehen, die mir in meinem Selbstlernprozess begegnen, obwohl ich bisher ziemlich glücklich / erfolgreich war.

Mein Eindruck ist, dass verschiedene Vorlagen verwendet werden können, um eine typsichere Funktionszusammensetzung wie in zu implementierendiese Frage. Mein Anliegen ist etwas allgemeiner, da ich Funktionen mit heterogenen (aber kompatiblen) Argument- / Rückgabetypen erstellen möchte. Ich habe viel gegoogelt und gefundeneine weitere Referenz, aber es scheint mir vollkommen "schwarze Magie" zu sein;) und ich werde nicht so tun, als könnte ich den Code in meinem Kontext anpassen, obwohl ich das Gefühl habe, ich sollte dort finden, was ich brauche.

Ich denke, der (unvollständigste) Code unten ist relativ selbsterklärend, was ich erreichen möchte. Insbesondere glaube ich, dass die richtige Implementierung einen Kompilierungsfehler auslöst, wenn versucht wird, inkompatible Funktionen zu kompilieren (Pfeil hier), und ein Stück rekursiven Vorlagencodes benötigt.

template <typename Source , typename Target> class Arrow
{
  Target eval (const Source &);
};

template <typename ...Arrows> class Compositor
{
  template <typename ...Arrows>
  Compositor (Arrows... arrows)
  {
     // do/call what needs be here
  };

  auto arrow(); // gives a function performing the functionnal composition of arrows

};

// define some classes A, B and C

int main(int argc, char **argv)
{
  Arrow < A , B >  arrow1;
  Arrow < B , C >  arrow2;

  Compositor< Arrow < A , B > , Arrow < B , C > > compositor(arrow1 , arrow2);

  Arrow < A , C >  expected_result = compositor.arrow();
}

Im Idealfall würde ich gerne
    Compositor
direkt Unterklasse
    Arrow < source_of_first_arrow , target_of_last_arrow>
und die Methode
   arrow()
durch die entsprechende ersetzt werden
    eval()

aber ich fand, dass der obige Code erklärender war.

Jede Hilfe wird sehr geschätzt, auch wenn es sich um eine grobe Rüge mit einem Hinweis auf ein vorhandenes (relativ einfaches) Beispiel handelt, das meiner Suche sicherlich entgangen ist. Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage