【问题标题】:Why does boost::variant not provide operator !=为什么 boost::variant 不提供运算符 !=
【发布时间】:2009-06-25 15:01:41
【问题描述】:

给定两个相同的 boost::variant 实例 ab,允许使用表达式 ( a == b )

但是 ( a != b ) 似乎是未定义的。这是为什么呢?

【问题讨论】:

  • 在我看来这是因为map 的满足需要==,(以及hash_value),但运算符!= 是奢侈的:)

标签: c++ boost-variant


【解决方案1】:

我认为它只是没有添加到库中。 Boost.Operators 并没有真正的帮助,因为任何一种变体都是从 boost::operator::equality_comparable 派生的。 David Pierre 说您可以使用它是对的,但您的回答也是正确的,新运算符!= 不会被 ADL 找到,因此您需要一个 using 运算符。

我会在 boost-users 邮件列表中问这个问题。

编辑@AFoglia 的评论:

七个月后,我正在研究 Boost.Variant,我偶然发现了对遗漏列表的更好解释。

http://boost.org/Archives/boost/2006/06/105895.php

operator== 调用 operator== 以获得当前在变体中的实际类。同样调用operator!= 也应该调用类的operator!=。 (因为理论上可以定义一个类,所以a!=b!(a==b) 不同。)所以这会增加另一个要求,即变体中的类具有operator!=。 (关于您是否可以在邮件列表线程中做出这种假设存在争议。)

【讨论】:

  • 七个月后,我正在研究 Boost.Variant,我偶然发现了对遗漏 lists.boost.org/Archives/boost/2006/06/105895.php 的更好解释。 Operator== 为当前在变体中的实际类调用 operator==。同样调用 operator!= 也应该调用类的 operator!=。 (因为理论上,可以定义一个类,所以 a!=b 与 !(a==b) 不同。)所以这会增加另一个要求,即变体中的类有一个运算符!=。 (关于你是否可以在邮件列表线程中做出这个假设存在争议。)
【解决方案2】:

这是a link to the answer from the author himself,当这个问题在 boost 邮件列表中提出时

总结一下,在作者看来,实现比较运算符(!= 和

不过我不同意他的观点,因为 != 可以以与 == 相同的方式实现,而不必为构成变体的每种类型隐藏这些运算符的可能实现

【讨论】:

    【解决方案3】:

    因为它不需要。

    Boost 有一个 operators library,它根据 operator== 定义 operator!=

    【讨论】:

    • 我可能是错的。但是,如果变体使用操作符库,那是否意味着 a != b 应该 可以工作?我认为他想要的是使用 std::rel_ops 代替:{ using std::rel_ops::operator!=;获取A()!=获取B(); }
    • 我并不是说变体是使用库本身,而是你可以自己来注入操作符!=
    • 所以期望在需要 != 的源文件中包含一个额外的标头并添加一个 using 声明?
    • @JohannesSchaub-litb:减少库之间的相互依赖关系也很好,如果客户需要的话,可以在更高级别将功能绑定在一起,这很容易。但是让我们让bcp 提取尽可能少的文件。仅 boost 的编译器配置部分就已经拉取了一千个文件。
    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多