假设我有数量可变的参数,我想将它们相乘。我想到的第一种方式是递归算法:
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...>
一起使用不过,而不是固定类型。 - 有没有更好的方法?有几种方法,但我可以想象编译器实际上可以很好地处理这种扩展。立即想到的替代方案是
return (args * ... * 1);
然而,这需要 C++17。如果至少有一个参数* 1
可以省略:如果有一个空的可变参数列表,它可以避免编译时错误。
关于c++ - 乘以可变数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40832711/