【问题标题】:Could C++ concepts be used to implement mixed type min and max in C++?C++ 概念可以用于在 C++ 中实现混合类型 min 和 max 吗?
【发布时间】:2021-05-25 18:42:11
【问题描述】:

您可能知道std::maxstd::min “受苦”,因为它们有 1 个模板参数,所以即使简单的 max(container.size(), 47) 也不起作用,因为 .size() 返回 size_t 而 47 是 int .

我知道过去有 proposal 向 C++ 添加适当的重载,但它被拒绝了。 但据我所知,这主要是因为纸张太复杂而没有足够的收益,所以我想知道是否有人会使用 std::common_range_t 作为返回值(发明的类型特征,让你的 int/float 大到足以容纳 min/max混合参数,否则硬错误)会很好......

所以最后要回答我的问题: 如果我们希望 min/max 扩展以采用上述 2 个模板参数,是否存在任何向后兼容性或任何其他阻止这种情况的问题?

注意:

  • 这主要是技术上可能的问题,我对 WG21 计划做任何事情来标准化这个问题感兴趣,主要是对潜在的技术限制感到好奇。
  • C++17 version of this question(由于某种原因严重否决????),但更笼统地说,还涉及一些其他限制。

【问题讨论】:

  • 你不是在问“C++ 概念”是否会让common_range_t 更容易实现吗?你认为min/maxcommon_range_t 的任何其他潜在用户有什么不同吗?如果有,请说明它们有何特别之处。
  • 我不知道你在问什么。标题是在谈论概念,内容是在谈论该论文的向后兼容性。另外,我不确定您为什么认为您的std::common_range_t 与论文中的内容不同(请注意,一些复杂性来自早于std::common_type 的论文)?
  • @Barry 是的,我脑子里很清楚......我的意思是 common_range_t 要求类型“足够接近”,也许如果我在标题中使用约束会更清晰?
  • @BenVoigt 我只是好奇是否存在一些向后可比性问题,如果我有 my_lib::max 我可以做我想做的事,因为我控制了所有用户

标签: c++ c++20 c++-concepts


【解决方案1】:

两个参数std::min/max引用返回到最小/最大参数。这要求它们具有相同的类型,因为您不能让函数返回不同的类型。也不能返回对临时对象的引用。

这样做的唯一方法是创建一个新函数,该函数返回一个值(可能是std::common_type 类型),一个最小值/最大值的副本。但由于它返回的是副本而不是引用,因此它不会向后兼容std::min/max

【讨论】:

  • "因为你不能让函数返回不同的类型。"太糟糕了,我认为概念会解决这种歧义,让我说一下,我对这个发现感到难过......
  • 一个可能有现有的签名(返回一个引用)和新的混合类型的一个作为后备,只有当参数无法绑定为现有签名中的引用时才会启动。
  • @BenVoigt 我想是的,问题是 common_type 没有按预期工作,但这不是问题,可以通过使用其他类型特征来解决(我认为对于 uint32 和 int32 它返回int32),或者修复我的代码中的错误 :) godbolt.org/z/oMGjnz6EW
  • @NoSenseEtAl:向后兼容需要一个额外的重载来支持现有的非常量引用签名,但您的模式效果很好:godbolt.org/z/qnnsfPG1E
  • @NoSenseEtAl 是的,你需要一个真正实现扩展的模板助手,而不是简单地使用 C++ 类型提升排名,它认为int -> unsigned 是扩展转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多