Composición funcional con plantillas variadas en C ++ 11

Soy un matemático que solía hacer la programación en C ++ de "estilo antiguo" durante mucho tiempo. Creo que algunas nuevas construcciones sintácticas ofrecidas por C ++ 11 podrían ayudarme a lograr un mejor código con respecto a mis proyectos profesionales. Sin embargo, como no soy profesional de CS, debo confesar que me falta el conocimiento para comprender algunos ejemplos que encuentro en mi proceso de autoaprendizaje, aunque hasta ahora he tenido bastante suerte y éxito.

Mi impresión es que las plantillas variables se pueden usar para implementar la composición de funciones de tipo seguro, como enesta pregunta. Mi preocupación es un poco más general ya que me gustaría componer funciones con tipos de retorno / argumento heterogéneos (pero compatibles). He buscado mucho en Google y he encontradootra referencia, pero me parece una "magia negra";) y no pretendo que pueda adaptar el código a mi contexto, aunque creo que debería encontrar lo que necesito allí.

Creo que el código (el más incompleto) a continuación se explica por sí mismo en cuanto a lo que me gustaría lograr. En particular, creo que la implementación adecuada generará un error en tiempo de compilación cuando intente componer funciones incompatibles (flecha aquí), y necesitará un código de plantilla recursiva.

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

Idealmente me gustaria
    Compositor
directamente subclase
    Arrow < source_of_first_arrow , target_of_last_arrow>
y el método
   arrow()
ser reemplazado por el correspondiente
    eval()

Pero sentí que el código anterior era más explicativo.

Cualquier ayuda será muy apreciada, incluso si consiste en una reprimenda aproximada con un puntero a un ejemplo existente (relativamente básico) que seguramente habrá escapado a mi búsqueda. ¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta