【问题标题】:optional parameter in template function模板函数中的可选参数
【发布时间】:2012-03-06 09:34:57
【问题描述】:

我正在尝试在模板函数中添加一个可选参数...基本上是一个根据用户类型重载关系运算符的参数。这是我的第一个模板函数,所以我很基础。这应该对用户类型的向量进行排序并返回最大的元素。比如:

template <typename Type>
Type FindMax(std::vector<Type> vec, RelationalOverloadHere)
/..../

第二个“可选”参数是什么样的?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    通常是这样的

    template<typename Type, typename BinaryOperation = std::less<Type> >
    Type FindMax(const std::vector<Type>& vec, BinaryOperation op = BinaryOperation());
    

    所以标准比较器是&lt;,但可以根据需要自定义。

    在标准库中,相应的算法是max_element,具有以下重载:

    template<typename ForwardIterator, typename Compare>
      ForwardIterator
      max_element(ForwardIterator first, ForwardIterator last, Compare comp);
    

    【讨论】:

    • 我认为 function template 的模板参数的默认参数仅在 C++11 中允许。不过我可能是错的。如果我错了,请告诉我。
    • @Nawaz 我知道 Visual Studio 不允许这样做,但这并不意味着什么……
    • @Nawaz:g++ 4.2 也不接受它,所以我认为你是对的。
    • 意味着我的函数需要是类模板还是函数模板?
    • @MCP:你总是可以像max_element那样重载函数。
    【解决方案2】:

    你到底在问什么不是很清楚..但是..

    这是一个可选参数,如果用户不提供任何内容,则为其指定默认值:

    template <typename Type>
    Type FindMax(const std::vector<Type> & vec, int foo = 1 /* <- This is a default that can be overridden. */)
    // ...
    

    【讨论】:

      【解决方案3】:

      这是一个工作程序,显示了我认为您正在寻找的示例:

      #include <vector>
      #include <iostream> 
      #include <functional>
      #include <algorithm>
      
      template <typename Type, typename Compare = std::less<Type>>
      Type findmax(std::vector<Type>& v, Compare comp = Compare())
      {
          return *std::max_element(v.begin(), v.end(), comp);
      }
      
      
      int main()
      {
          int a[] = {1, 11, 232, 2, 324, 21};
          std::vector<int> v(a, a+6);
      
          std::cout << findmax(v) << std::endl;
      }
      

      【讨论】:

      • 杰西!非常感谢。
      • 现在...我收到默认模板参数只允许在类模板上的错误...建议?是不是只能把这个函数(findmax)改写成一个类?
      猜你喜欢
      • 1970-01-01
      • 2022-07-20
      • 2011-12-08
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多