【问题标题】:Variadic function template base case: without parameters or with one?可变参数函数模板基本案例:没有参数还是只有一个?
【发布时间】:2015-10-09 09:47:23
【问题描述】:

我想知道这些选项中的哪一个(如果有)更受青睐。

例如,我正在实现一个带有任意数量参数的 sum 函数。然后是主模板

template <typename T, typename... Ts>
auto sum(T t, Ts... ts)
{
    return t + sum(ts...);
}

对于基本情况,我至少可以看到两个选项:

  1. 基本情况是 sum():

    auto sum() 
    { 
        return 0; 
    }
    
  2. 基本情况是 sum(T):

    template <typename T>
    auto sum(T t)
    {
        return t;
    }
    

在这种情况下,这两种方法似乎都以相同的方式工作,但通常首选哪一种?

【问题讨论】:

  • 我认为第二种情况更好,因为第一种添加了无参数的操作
  • 尝试两者并测量。您可能会发现优化后它们最终得到了相同的程序集。
  • 我会使用第一个只是因为有一天你可能真的需要在你的其他代码中具有零参数的版本。
  • 第二版编译速度会快一点。我宁愿选择至少有 2 个参数的版本,因为 logical 和可能发生在 2 个数字之间。

标签: c++ c++11 variadic-templates c++14 variadic-functions


【解决方案1】:

第二种情况比引入int的选项1更通用。

ie:使用第二个选项,您可以sum 某个矩阵类,而第一个选项不允许这样做。 (不过,您应该通过 const 引用来获取参数以对矩阵情况有效)。

通过引入int,您还可以在某些情况下获得不同的返回类型

auto res = sum('*');

这导致选项 1 的 int 类型和选项 2 的 char 类型

【讨论】:

  • 更通用 表明只有这一个标准。但至少还有另一个,正如 Petr 所指出的:sum(t...) 是否适用于sizeof...(t) == 0。 (但这仍然是一个有效的问题,sum() 应该有什么类型。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2018-07-02
相关资源
最近更新 更多