假设我有一个可变数量的参数,我想将它们相乘.我想到的第一种方法是递归算法:
template<typename Head> u64 Multiply(Head head) const { return head; } template<typename Head,typename... Tail> u64 Multiply(Head head,Tail... tail) const { return head * Multiply(tail...); }
但后来我看到了这个伎俩:
// u32 and u64 are 32 and 64 bit unsigned integers. template<typename... T> u64 Multiply(T... args) { u64 res = 1; for (const u32& arg: {args...}) res *= arg; return res; }
第二个似乎对我更好.更容易阅读.但是,这如何影响性能呢?有什么东西被复制了? {args …}首先做了什么?有更好的方法吗?
我可以访问C 14.
编辑要清楚:它是关于运行时乘法,而不是编译时间.
更清楚:我不想有必要计算整数(虽然这是我当前的应用程序),但我发现的算法专门用于整数.
更多:参数属于同一类型.没有这种限制的算法会非常有趣,但也许是针对不同的问题.
解决方法
这里有几个问题:
>对性能有何影响?不知道.你需要衡量.根据参数的类型,我可以想象编译器完全以任何一种方式优化事物:它确实知道参数的数量和类型.>什么是{args …}?好吧,它创建了一个std :: initializer_list< T>对于常见类型的参数(假设有一个).您可能希望将该值与std :: common_type_t< T ...>一起使用.但是,而不是固定类型.>有更好的方法吗?有几种方法,虽然我可以想象编译器实际上对这种扩展做得很好.立即想到的另一种选择是返回(args * … * 1);但是,它需要C 17.如果至少有一个参数,则可以省略* 1:如果存在可变参数的空列表,则可以避免编译时错误.