我正在编写一个模板函数,它接受一个元素向量并对其执行一些操作序列。其中一个操作是std :: sort()。
当然,客户端代码需要提供比较器函子。如果它传入一个众所周知的类型(整数,字符串等)的容器,我不希望客户端代码为此参数指定值。我该如何定义Comp模板参数的默认值?
template<typename Container, typename Comp=????>
void my_func(Container elements, Comp comp) {
...
std::sort(elements.begin(), elements.end(), comp);
...
}
答案 0 :(得分: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);
}
答案 1 :(得分: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()
答案 2 :(得分:0)
我不会将模板本身,而是函数的参数分别默认为类似于std::greater
或std::less
的{{1}}和>
。 <
默认使用std::sort
。
如果你想获得它的模板参数,那么有一个建议让std::less
适用于实际上被C ++ 14接受的称为N3421的通用类型。
但在此之前,您可以执行std::greater<>
。如果愿意,您可以选择使用type_traits删除引用或cv限定符。
std::greater<typename Container::value_type>
有其他默认比较,但这两者是最常见的。
所以“完整”的解决方案就是这样的:
<functional>
答案 3 :(得分:0)
在您的示例中有2个问题:
要制作默认行为,您必须将less<T>
作为仿函数。
您的功能正在执行副本,因此,副本将进行排序,除非您对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);
}