Функциональная композиция с вариационными шаблонами в C ++ 11

Я математик, который давно занимается программированием на С ++ в "старом стиле". Я чувствую, что некоторые новые синтаксические конструкции, предлагаемые C ++ 11, могут помочь мне достичь лучшего кода относительно моих профессиональных проектов. Тем не менее, поскольку я не профессионал в CS, я должен признаться, что мне не хватает знаний, чтобы понять некоторые примеры, с которыми я сталкиваюсь в процессе самообучения, хотя я до сих пор был довольно удачливым / успешным.

У меня сложилось впечатление, что шаблоны variadic можно использовать для реализации композиций с безопасными типами, как вэтот вопрос, Моя задача немного более общая, поскольку я хотел бы составлять функции с разнородными (но совместимыми) типами аргументов / возвращаемых значений. Я много гуглил и нашелдругая ссылка, но мне кажется, что это «чёрная магия»;) и я не буду притворяться, что могу адаптировать код в моем контексте, хотя я чувствую, что должен найти там то, что мне нужно.

Я думаю, что (наиболее неполный) код, приведенный ниже, относительно понятен относительно того, чего я хотел бы достичь. В частности, я считаю, что правильная реализация вызовет ошибку во время компиляции, когда кто-то пытается сочинить несовместимые функции (стрелка здесь), и ему понадобится фрагмент рекурсивного кода шаблона.

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

В идеале я бы хотел
&nbsp;&nbsp;&nbsp;&nbsp;Compositor
непосредственно подкласс
&nbsp;&nbsp;&nbsp;&nbsp;Arrow < source_of_first_arrow , target_of_last_arrow>
и метод
&nbsp;&nbsp;&nbsp;arrow()
заменить на соответствующий
&nbsp;&nbsp;&nbsp;&nbsp;eval()






но я чувствовал, что приведенный выше код был более объяснительным.

Любая помощь будет принята с благодарностью, даже если она состоит из грубого упрека с указанием на существующий (относительно базовый) пример, который наверняка ускользнет от моего поиска. Спасибо!