为什么有两个std :: sort实现(有和没有比较器)而不是一个带有默认模板参数的实现?

时间:2012-06-29 15:12:18

标签: c++ templates stl parameters default

在我的代码中,我采用的设计策略类似于一些标准库算法,因为确切的行为可以由函数对象定制。最简单的例子是std :: sort,其中函数对象可以控制对象之间的比较方式。

我注意到Visual C ++提供了std :: sort的两个实现,这自然涉及代码重复。我本以为可能只有一个实现,并提供默认比较器(使用operator<)作为默认模板参数。

两个独立版本背后的理性是什么?我的建议会以某种方式使界面更复杂吗?或者当对象不提供运算符时导致混淆的错误消息< ?或者它可能不起作用?

谢谢,

大卫

2 个答案:

答案 0 :(得分:12)

因为标准不允许函数模板具有默认类型参数。

This, however, was amended in C++11,现在功能模板可以有默认的类型参数。

答案 1 :(得分:2)

在C ++ 11之前,函数模板不能有默认模板参数,并且模板参数不能从默认函数参数中推导出来,因此无法使其工作。

在支持函数模板的默认模板参数的C ++ 11中,您可以使用单个函数模板,但现在更改它会破坏与依赖于具有特定类型的函数的旧C ++代码的向后兼容性。