Skład funkcjonalny z szablonami zmiennymi w C ++ 11

Jestem matematykiem, który od dawna zajmuje się programowaniem C ++ w starym stylu. Czuję, że niektóre nowe konstrukcje składniowe oferowane przez C ++ 11 mogą pomóc mi uzyskać lepszy kod dotyczący moich projektów zawodowych. Jednak jako że nie jestem profesjonalistą, muszę przyznać, że brakuje mi wiedzy, aby zrozumieć kilka przykładów, które napotykam w procesie samokształcenia, chociaż do tej pory miałem szczęście / sukces.

Mam wrażenie, że szablony zmienne mogą być używane do implementacji kompozycji funkcji bezpiecznych dla typu, jak wto pytanie. Moje obawy są nieco bardziej ogólne, ponieważ chciałbym skomponować funkcje z heterogenicznymi (ale zgodnymi) typami argumentów / zwrotów. Wiele googlałem i znalazłeminne odniesienie, ale wydaje mi się, że jest to „czarna magia”;) i nie będę udawał, że mogę dostosować kod w moim kontekście, chociaż czuję, że powinienem tam znaleźć to, czego potrzebuję.

Myślę, że poniższy (najbardziej niekompletny) kod jest dość oczywisty, co chciałbym osiągnąć. W szczególności uważam, że właściwa implementacja spowoduje błąd kompilacji, gdy ktoś próbuje skomponować niekompatybilne funkcje (Strzałka tutaj) i będzie potrzebował kawałka rekurencyjnego kodu szablonu.

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();
}

Idealnie chciałbym
    Compositor
bezpośrednio podklasować
    Arrow < source_of_first_arrow , target_of_last_arrow>
i metoda
   arrow()
być zastąpione przez odpowiednie
    eval()

ale czułem, że powyższy kod jest bardziej wyjaśniający.

Każda pomoc zostanie bardzo doceniona, nawet jeśli polega na surowej naganie ze wskaźnikiem do istniejącego (względnie podstawowego) przykładu, który z pewnością umknie moim poszukiwaniom. Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion