В настоящее время я кодирую некоторые криптографические алгоритмы в С++ 11, которые требуют много функциональных композиций. Мне нужно иметь два типа композиции:
-
Составить функцию на себе переменное число раз. Математически для некоторой функции F, F ^ n (x) = (F ^ {n-1} o F) (x) = F ^ {n-1} (F (x)).
-
Составить различные функции вместе. Например, для некоторых функций f, g, h, i, j и k одного и того же типа у меня будет f (g (h (i (j (k (x)))))).
В моем случае я использую следующее определение F:
const std::vector<uint8_t> F(const std::vector<uint8_t> &x);
Я хотел бы записать эту функцию на себя n раз. Я реализовал композицию простым рекурсивным способом, который работает нормально:
const std::vector<uint8_t> compose(const uint8_t n, const std::vector<uint8_t> &x)
{
if(n > 1)
return compose(n-1, F(x));
return F(x);
}
В этом случае существует ли более эффективный способ реализации этой композиции с использованием С++ 11, но без использования BOOST? Было бы здорово использовать эту форму, если это возможно, конечно:
answer = compose<4>(F)(x); // Same as 'answer = F^4(x) = F(F(F(F(x))))'
Во втором случае я хотел бы реализовать состав переменного числа функций. Для заданного набора функций F0, F1,..., Fn, имеющих такое же определение, что и F, существует эффективный и правильный способ их компоновки, где n является переменной? Я думаю, что вариационный шаблон будет полезен здесь, но я не знаю, как их использовать в этом случае.
Спасибо за вашу помощь.