gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:36:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com