gpt4 book ai didi

c++ - std::reference_wrapper 是否应该包含默认比较器 "<"运算符?

转载 作者:可可西里 更新时间:2023-11-01 16:37:44 25 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




9年前关闭。




STL 使用“小于”作为默认比较器。对用 reference_wrapper<> 包裹的对象的 STL 比较器调用 does not compile ,即使基础类定义了“<”运算符。

看来,这是因为有no implicit conversion当 LHS.operator<(RHS) 是成员函数时,在 LHS 上执行。我已经确认 using a free version当比较器工作时。

但是,如果reference_wrapper 提供了“<”操作符,它在底层调用“<”,就不需要使用free 函数了。

我在 reference_wrapper 的代码中添加了以下内容(取自 VS11 Beta xrefwrap.h),并且可以将 std::map 与包装在我的 reference_wrapper<> 版本中的类一起使用,该类定义了“<”运算符。

    bool operator <(reference_wrapper<_Ty> const rhs) const {
return this->get() < rhs.get();
}

稍后补充:如果我理解正确,reference_wrapper<> 提供了与许多库所需的 ptr 相关的复制/分配语义,同时隐藏了与 ptr 相关的语法。这允许使用引用类型语法,而没有本地拷贝的开销。将其与使用 ptr 的示例进行比较完全错过了 reference_wrappers 的要点:要避免使用ptr 类型的语法。

现在的情况是,当对象被包装在 reference_wrappers 中时,直接作用于对象的代码会中断。不用说,“<”是默认的比较器,确实让它很特别;在现有代码的很大一部分中,对象将定义这些代码以消除对特殊比较器的需要。

稍后添加 #2:
此功能的历史表明,避免使用 ptr 语法并不是最初的意图。但是,自从首次在 boost 中引入以来,已经过去了十年。带一大批新程序员“导” to avoid ptr based syntax (无疑受到 ptr 自由语言的影响),如果这个特性可以更无缝地工作,它会变得越来越有用,尤其是在处理在 STL 容器中存储对象的遗留代码时,以及整个值拷贝时。

后来添加 #3:以最少的代码更改改进遗留代码
随着时间的推移,瘦类变得很重,容器中对象的大小也会增加。提高性能的一种快速方法是通过包装对象避免复制。这将提供“C ptr”类型的性能,而无需对代码进行最少更改的额外拷贝。
std::map<const Object, string> objTable;
// can be rewritten as to avoid object copies using the
// __myOwn::reference_wrapper which contains the '<' operator
std::map<__myOwn::reference_wrapper<const Object>, string> rwTable_myOwn;

// which works with out any non-member free comparator functions
rwTable_myOwn[a]="One"; // Compiles and works

// When using the table with the std::reference_wrapper
std::map<std::reference_wrapper<const Object>, string> rwTable_std;
//the map does not work
rwTable_std[a]="One"; // Fails to compile it needs the custom non-member comparator

最佳答案

不,不应该。不是reference_wrapper的工作是做任何事情,但将引用包装为值。

如果您需要比较两个 reference_wrapper<T> 's(它不是​​对 T 的引用),那么你的工作就是让它发挥作用。出于同样的原因 std::set<T*>不默认将比较定义为 std::less<T>(*x, *y) ,你的情况也不应该。包装器只是一个非空指针。

为什么只停留在单个比较运算符或所有比较运算符上?为什么不重载所有标准函数的引用包装器?因为当解决方案如此简单时,这不值得。

关于c++ - std::reference_wrapper 是否应该包含默认比较器 "<"运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10730111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com