乘以可变数量的参数

Aar*_*man 7 c++ templates c++14

假设我有一个可变数量的参数,我想将它们相乘.我想到的第一种方法是递归算法:

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...);
}
Run Code Online (Sandbox Code Playgroud)

但后来我看到了这个伎俩:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

第二个看起来对我来说更好.更容易阅读.但是,这如何影响性能呢?有什么东西被复制了?{args...} 首先做什么?有更好的方法吗?

我可以访问C++ 14.

编辑要清楚:它是关于运行时乘法,而不是编译时间.

更清楚:我不想有必要计算整数(虽然那是我当前的应用程序),但我发现的算法专门用于整数.

更多:参数属于同一类型.没有这种限制的算法会非常有趣,但也许是针对不同的问题.

Die*_*ühl 4

这里提出了多个问题:

  1. 对性能有什么影响?不知道。你需要测量一下。根据参数的类型,我可以想象编译器会以两种方式完全优化事物:它确实知道参数的数量和类型。
  2. 什么是{ args... }?好吧,它std::initializer_list<T>为参数的通用类型创建了一个(假设有一个)。不过,您可能希望使用该值而std::common_type_t<T...>不是固定类型。
  3. 有更好的方法吗?尽管我可以想象编译器实际上在这种扩展方面做得相当好,但有几种方法。然而,我立即想到的替代方案是return (args * ... * 1);需要 C++17。如果至少有一个参数* 1可以省略:它是为了避免在可变参数列表为空时出现编译时错误。