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