我目前正在用 C++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);
}
对于这种情况,是否有更有效的方法可以使用 c++11 但 不使用 BOOST 来实现这种组合?当然,如果可能的话,使用这种形式会很棒:
answer = compose<4>(F)(x); // Same as 'answer = F^4(x) = F(F(F(F(x))))'
对于第二种情况,我想实现可变数量的函数的组合。对于给定的一组函数 F0, F1, …, Fn 与 F 具有相同的定义,是否有一种有效且适当的方法来组合它们,其中 n 是可变的?我认为可变参数模板在这里会很有用,但我不知道在这种情况下如何使用它们。
谢谢你的帮助。
原文由 Gabriel L. 发布,翻译遵循 CC BY-SA 4.0 许可协议
这些方面的东西,也许(未经测试):
编辑: 对于第二种情况( 这次测试):