【问题标题】:Why are there two implementations of std::sort (with and without a comparator) rather than one implementation with a default template parameter?为什么有两个 std::sort 实现(有和没有比较器)而不是一个带有默认模板参数的实现?
【发布时间】:2012-07-01 03:17:29
【问题描述】:

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

我注意到 Visual C++ 提供了两种 std::sort 实现,这自然会涉及代码重复。我会想象它可能只有一个实现,并提供一个默认比较器(使用 operator

两个不同版本背后的原因是什么?我的建议会以某种方式使界面更复杂吗?或者当对象不提供 operator

谢谢,

大卫

【问题讨论】:

  • "我注意到 Visual C++ 提供了 std::sort 的两种实现,这自然会涉及代码重复。" 你为什么会这样认为?明显的实现是对于缺少谓词参数的重载,根据采用谓词参数的重载来实现(为所述参数传递std::less<typename std::iterator_traits<Iter>::value_type>())。
  • “你为什么会这样想?” - 我正在研究 Visual C++ 附带的算法的实现,并看到两个单独的实现。
  • 这是一个单一的、显然很糟糕的实现;我选择了“自然”这个词,这肯定是不准确的。

标签: c++ templates stl parameters default


【解决方案1】:

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

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

【讨论】:

  • 我会提到,虽然正确,但现在这只是一个历史原因,因为 C++11 允许这样做。
  • 对 C++ 中的模板几乎一无所知,就不能重载函数模板吗?
  • @JAB 是的,你是,鼓励他们专注于他们。
  • @R.MartinhoFernandes 是的,我只是想确认一下,然后再将其添加到答案中。
  • 因此,如果您使用的是非 C++11 代码,您可以简单地让具有较少模板参数的重载模板包装具有更多参数的模板吗?最后我检查了一下,这是喜欢重载而不是使用默认参数的语言的一般约定。
【解决方案2】:

在 C++11 之前,函数模板不能有默认模板参数,并且不能从默认函数参数推导出模板参数,因此无法实现。

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

【讨论】:

  • 好的,谢谢。我想我宁愿避免要求我的用户支持 C++11,所以我想我会遵循 STL 模型。
  • 如果您支持 Visual C++(您在问题中指出),这一点尤其重要,因为它还不支持 C++11 的默认函数模板参数 :-)
  • 啊,好吧,那就解决了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2011-04-21
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多