【发布时间】:2016-11-27 18:59:00
【问题描述】:
假设我有不同数量的参数,我想将它们相乘。我想到的第一种方式是递归算法:
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。
编辑要清楚:这是关于运行时乘法,而不是编译时。
更清楚一点:我不想计算整数(尽管这是我当前的应用程序),但我发现的算法专门用于整数。
更多:参数属于同一类型。没有这种限制的算法会非常有趣,但可能会针对不同的问题。
【问题讨论】:
-
我认为,当 mixed 整数类型的值传递给函数时,第二种方法可能不起作用,例如:
Multiply(1, 1u, 1ul, 1ull);。 -
第二个函数假定
T是整数类型,第一个函数不是这样 -
@Snps 为什么#1 应该在编译时?它是运行时,就像#2
-
或者等待C++17和
return (args * ... * 1);。 -
@Rakete1111:因为它是毫无意义的椭圆,没有任何好处,让我停下来思考的时间比我想的要长:-S