1

我正在编写一个模板函数,它接受一个元素向量并对其进行一系列操作。这些操作之一是 std::sort()。

自然,客户端代码需要提供一个比较器函子。如果客户端代码传入已知类型(整数、字符串等)的容器,我不希望客户端代码为此参数指定值。我应该如何定义我的 Comp 模板参数的默认值?

template<typename Container, typename Comp=????>
void my_func(Container elements, Comp comp) {
  ...
  std::sort(elements.begin(), elements.end(), comp);
  ...
}
4

4 回答 4

2

std::sort 使用“Less”作为默认比较器。所以要保持一致:

template<typename Container, typename Comp = std::less<typename Container::value_type> >
void my_func(Container& elements, Comp comp = Comp())
{
  std::sort(elements.begin(), elements.end(), comp);
}
于 2013-07-13T05:38:56.367 回答
0
#include <vector>
#include <algorithm>

template<typename Container, typename Comp=std::less<typename Container::value_type>>
void my_func(Container elements, Comp comp = Comp()) {
  //...
  std::sort(elements.begin(), elements.end(), comp);
  //...
}

int main() {
    std::vector<int> v;
    my_func(v);
}

另请注意Comp comp = Comp()

于 2013-07-13T05:37:23.510 回答
0

我不会默认模板本身,而是将函数的参数分别设置为类似于std::greaterstd::lessfor>和的东西<std::sort默认使用std::less

如果你想获得它的模板参数,那么有一个建议可以std::greater<>用于名为N3421的通用类型,它实际上已被 C++14 接受。

但是在那之前你可以做到std::greater<typename Container::value_type>。如果您愿意,您可以选择使用 type_traits 删除引用或 cv 限定符。

<functional>有其他默认比较,但这两个是最常见的。

所以一个“完整”的解决方案是这样的:

template<typename Container, typename Comp>
void my_func(Container& elements, Comp comp = std::less<typename Container::value_type>()) {
  std::sort(elements.begin(), elements.end(), comp);
}
于 2013-07-13T05:37:25.603 回答
0

在您的示例中有两个问题:

  1. 要做出默认行为,您必须less<T>作为仿函数提供。

  2. 您的函数正在获取副本,因此将对副本进行排序,除非您Container改为引用。

示例如何制作:

#include <functional>
template<typename Container, typename Comp=std::less<typename Container::value_type> >
void my_func(Container &elements, Comp comp = Comp() )
{
  std::sort(elements.begin(), elements.end(), comp);
}
// A partial specialisation for std::list
#include <list>
template<typename ContainerValueType, typename Allocator, typename Comp=std::less<ContainerValueType> >
void my_func(std::list<ContainerValueType, Allocator> &elements, Comp comp = Comp() )
{
  elements.sort(comp);
}
于 2013-07-13T05:41:36.863 回答