Composição funcional com modelos variados em C ++ 11

Eu sou um matemático acostumado a fazer programação C ++ "antiga" por um longo tempo. Sinto que algumas novas construções sintáticas oferecidas pelo C ++ 11 poderiam me ajudar a obter um código melhor em relação aos meus projetos profissionais. No entanto, como não sou profissional de CS, devo confessar que não tenho conhecimento para entender alguns exemplos que encontro no meu processo de autoaprendizagem, apesar de ter tido muita sorte / sucesso até agora.

Minha impressão é que modelos variados podem ser usados para implementar a composição de funções seguras para tipos, como emessa questão. Minha preocupação é um pouco mais geral, pois gostaria de compor funções com tipos de argumento / retorno heterogêneos (mas compatíveis). Eu pesquisei muito e encontreioutra referência, mas me parece "magia negra" absoluta;) e não vou fingir que posso adaptar o código no meu contexto, apesar de achar que devo encontrar o que preciso lá.

Eu acho que o código (mais incompleto) abaixo é relativamente auto-explicativo sobre o que eu gostaria de alcançar. Em particular, acredito que a implementação adequada gerará um erro em tempo de compilação quando alguém estiver tentando compor funções incompatíveis (seta aqui) e precisará de um código de modelo recursivo.

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, eu gostaria
    Compositor
subclasse diretamente
    Arrow < source_of_first_arrow , target_of_last_arrow>
e o método
   arrow()
ser substituído pelo correspondente
    eval()

mas achei que o código acima era mais explicativo.

Qualquer ajuda será muito apreciada, mesmo que consista em uma repreensão grosseira com um ponteiro para um exemplo de exemplo existente (relativamente básico) que certamente terá escapado da minha pesquisa. Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion