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

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

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

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

template  class Arrow
{
  Target eval (const Source &);
};

template  class Compositor
{
  template 
  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();
}

В идеале ямне нравится

Compositor

непосредственно подкласс

Arrow < source_of_first_arrow , target_of_last_arrow>

и метод

arrow()

заменить на соответствующий

eval()

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос