【问题标题】:With variadic function templates can we design a function that can be called with at least 2 arguments?使用可变参数函数模板,我们可以设计一个至少可以用 2 个参数调用的函数吗?
【发布时间】:2021-08-10 16:50:30
【问题描述】:

我刚刚开始了解可变参数函数模板。 是否可以定义用 2 个或更多参数编写通用案例(处理递归)?也就是说,我想知道我可以写如下内容:

template <class T>
void min(T val1, T val2) { return val1>val2 ? val2 : val1 ; }

template <class T, class... Others>
void min(T a1, T a2, Others ... others) {
    // implementation
    T a = a1 > a2 ? a2 : a1 ;
    // min(a, first-element-in-others, all-elems-in-others-except-first) ;
}

如果可能的话,有人可以告诉我怎么做吗?

【问题讨论】:

  • 是的。您是否尝试编译它?这似乎很好......
  • "first-element-in-others, all-elems-in-others-except-first" 这听起来就像“others 中的所有元素”,它是others...。您可能还想查看 fold 表达式
  • @Elliott 我在注释的min 函数调用中写了什么
  • 执行此操作时,避免重复的常见模式是:T min (T a1, T a2, Ts ... as) { return min(min(a1, a2), as...);} 这样您就只依赖基函数进行实际计算。
  • @user3282758 我想你可能想把那里的void改成T,否则当你尝试使用该函数时编译器可能会抛出错误。

标签: c++ variadic-templates


【解决方案1】:

这是一个完整的代码(注意,按照惯例,min 函数应该只需要运算符 &lt;):

template <class T>
constexpr T min(T val1, T val2) { return val1 < val2 ? val1 : val2 ; }

template <class T, class... Others>
constexpr T min(T a1, T a2, Others... others) {
    T a = min(a1, a2);
    return min(a, others...);
}

请注意,您可能希望通过 const 引用接受参数,但我已将其留到另一天。

【讨论】:

  • 这和我的代码一样。我正在为 c++11 使用 gcc 编译器。代码编译给出以下错误/usr/include/c++/9/bits/stl_algobase.h:249:17: error: ‘__comp’ cannot be used as a function 249 | if (__comp(__b, __a)) | ~~~~~~^~~~~~~~~~
  • @user3282758,这不是一个完整的程序。您的错误来自代码的其他部分。可能你已经包含了&lt;algorithm&gt; 并使用了namespace std;,这会在这里造成很大的问题。不管怎样,这段代码肯定没问题。您已经获得了许多指向实时代码的链接来证明这一点。
【解决方案2】:

您是否正在寻找类似的东西?

// C++11 or above
template <typename T>
T min(T const& val1, T const& val2) {
    return val1 > val2 ? val2 : val1;
}

template <typename T, typename... Others>
T min(T const& a1, T const& a2, Others... others) {
    T const a = min(a1, a2);
    return min(a, others...);
}

它似乎也可以编译。

如果你想自己尝试一下,那就去吧:

Demo

【讨论】:

    【解决方案3】:

    您非常接近实际实现,但是弄乱了返回类型。

    template <class T>
    T min(T a, T b) 
    {
        return std::min(a, b);
    }
    
    template <class T, class... Others>
    T min(T a1, T a2, Others ... others) {
        return min(min(a1, a2), others...);
    }
    

    https://godbolt.org/z/5dGeW79Md

    【讨论】:

    • 是的,实际上我的实现弄乱了 std::min ...我更改了我的函数名称,现在它可以工作了。 @Marek R 你的解决方案突然帮助了我
    【解决方案4】:

    确保返回T,不要写using namespace std,否则会与标准库函数min发生冲突。

    #include <algorithm>
    
    template <class T>
    T min (T a) 
    {
        return a;
    }
    
    template <class T, class... Ts>
    T min (T a1, T a2, Ts ... as)
    {
        return min(std::min(a1, a2), as...);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2012-08-15
      相关资源
      最近更新 更多