c++ - 乘以可变数量的参数

标签 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...);
}

但是后来我看到了这个把戏:

// 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。

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

需要明确的是:我不一定要计算整数(尽管这是我当前的应用),但我发现的算法专门用于整数。

更多:参数属于同一类型。没有此限制的算法会非常有趣,但可能适用于不同的问题。

最佳答案

这里有多个问题:

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

关于c++ - 乘以可变数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40832711/

相关文章:

c++ - 如何安全地停止 IOCP WSARecv() 任务,并释放 WSAOVERLAPPED 结构?

c++ - 模板类中函数指针的成员给出错误 : must be a class or namespace when followed by '::'

vba - Excel 中的 Normal.dotm 等效项,用于引用相同的单个 VBA 代码

c++ - void* 是否保留继承信息?

c++ - 可能的缓冲区溢出问题

c++ - std::declval<T>() 是如何工作的?

c++ - 非类型模板类成员特化

c++ - 是否有像 C# 中那样的 C++ new 声明

c++ - 通用成员函数定义,可从 'const' 和 'non-const' 对象实例化

c++ - 获取继承基类类型的元组