C++概念可以用于在C++中实现混合类型min和max吗?
您可能知道std::max并std::min“受苦”,因为它们有 1 个模板参数,因此即使简单max(container.size(), 47)也行不通,因为 .size() 返回size_t而 47 是int。
我知道历史上曾有人提议向 C++ 添加适当的重载,但被拒绝了。但据我所知,这主要是由于纸张过于复杂而无法获得足够的收益,所以我想知道是否可以将其std::common_range_t用作返回值(发明的类型特征使您的 int/float 足够大以容纳混合参数的最小值/最大值,否则会出现硬错误)那会好吗...
所以最终得到我的问题:如果我们希望 min/max 扩展为采用 2 如上所述的模板参数,是否有任何向后兼容性或任何其他问题阻止了这一点?
笔记:
- 这主要是技术上可能的问题,我对 WG21 是否计划做任何事情来标准化这个问题不感兴趣,主要是对潜在的技术限制感到好奇。
- 这个问题的 C++17 版本(由于某种原因被严重低估),但更一般的是,还涉及其他一些限制。
回答
两个参数std::min/max返回对最小值/最大值参数的引用。这要求它们的类型相同,因为您不能让函数返回不同的类型。您也不能返回对临时对象的引用。
做到这一点的唯一方法是创建一个新函数,该函数返回一个值(可能是 类型std::common_type),即最小值/最大值的副本。但由于它返回一个副本而不是一个引用,它不会向后兼容std::min/max.
- One could presumably have the existing signature (returning a reference) and the new mixed-type one as a fallback that kicks in only when arguments fail to bind as references in the existing signature.
- @NoSenseEtAl: Backwards-compatibility demands one more overload to support the existing non-const reference signature, but your pattern worked great: https://godbolt.org/z/qnnsfPG1E