Функциональная композиция с вариационными шаблонами в 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();
}
В идеале я бы хотел
Compositor
непосредственно подкласс
Arrow < source_of_first_arrow , target_of_last_arrow>
и метод
arrow()
заменить на соответствующий
eval()
но я чувствовал, что приведенный выше код был более объяснительным.
Любая помощь будет принята с благодарностью, даже если она состоит из грубого упрека с указанием на существующий (относительно базовый) пример, который наверняка ускользнет от моего поиска. Спасибо!