在 C++ 中自动推导运算符?

发布于 2024-08-05 10:03:11 字数 232 浏览 5 评论 0原文

在 C++ 中,编译器/语言是否可以自动推导未实现的运算符?

例如,如果我有:

class X
{
public:
   bool operator ==(const X &x) const;
};

有没有办法隐式推导 != ?

我将利用这个问题来解决一个半相关的问题:为什么映射的键的唯一要求是实现 <<操作员?它如何比较平等?

Is it possible in C++ for the compiler/language to automatically deduce unimplemented operators?

For example, if I have:

class X
{
public:
   bool operator ==(const X &x) const;
};

Is there a way for != to be deduced implicitly?

And I'll exploit this questions for a semi-related one: How come map's only requirement from it's keys is to implement the < operator? How does it compare for equality?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

安静被遗忘 2024-08-12 10:03:11

关于相关问题,它是一个等价类。两个事物 'x' 和 'y' 是等价的,如果

!(x < y) && !(y < x)

Regarding the related question, it's an equivalence class. Two things 'x' and 'y' are equivalent if

!(x < y) && !(y < x)
深海不蓝 2024-08-12 10:03:11

STL 已经有一组定义。
在命名空间 stl::rel_ops 中可以找到以下定义。

namespace std
{
  namespace rel_ops
  {
    // Uses ==
    template <class _Tp> inline bool operator!=(const _Tp& __x, const _Tp& __y);

    // Uses <
    template <class _Tp> inline bool operator>(const _Tp& __x, const _Tp& __y);
    template <class _Tp> inline bool operator<=(const _Tp& __x, const _Tp& __y);
    template <class _Tp> inline bool operator>=(const _Tp& __x, const _Tp& __y);

  } // namespace rel_ops
}

要使用它,你只需要这样做:

#include <utility>
using namespace std::rel_ops;

尽管我个人会尽可能限制使用范围。

The STL already has a set of definitions.
In the namespace stl::rel_ops the following definitions can be found.

namespace std
{
  namespace rel_ops
  {
    // Uses ==
    template <class _Tp> inline bool operator!=(const _Tp& __x, const _Tp& __y);

    // Uses <
    template <class _Tp> inline bool operator>(const _Tp& __x, const _Tp& __y);
    template <class _Tp> inline bool operator<=(const _Tp& __x, const _Tp& __y);
    template <class _Tp> inline bool operator>=(const _Tp& __x, const _Tp& __y);

  } // namespace rel_ops
}

To use it you just need to do:

#include <utility>
using namespace std::rel_ops;

Though personally I would restrict the scope of the using as much as possable.

不乱于心 2024-08-12 10:03:11

Boost 运算符可以做你想做的事。

至于你的第二个问题:如果A不小于B且B不小于A,则两个值A和B相等。

boost operators can do what you want.

As for your second question: two values A and B are equal, if A is not less than B and B is not less than A.

从﹋此江山别 2024-08-12 10:03:11

C++的规则不允许大多数运算符的完全隐式推导,但您可以在“模板方法设计模式”模型中通过继承来模拟它;一个过于简单的例子...:

template <typename X> class ne
{
public:
   bool operator !=(const X &x) const
   { return ! ( (*(const X*)this) == x ); }
};

class X: public ne<X>
{
   int x;
public:
   X(int x): x(x) {}
   bool operator ==(const X &other) const
   { return x == other.x; }
};

其他答案已经向您指出了一个基于巧妙模板和 c 的系统库,用于此类目的(增强)以及第二个问题的答案(一旦您有了 <,所有需要的比较,包括相等性,都可以在 std 库代码中轻松实现 (<)。

Completely implicit deduction of most operators is not allowed by C++'s rules, but you can mostly simulate it with inheritance in the "template method design pattern" mold; an oversimplified example...:

template <typename X> class ne
{
public:
   bool operator !=(const X &x) const
   { return ! ( (*(const X*)this) == x ); }
};

class X: public ne<X>
{
   int x;
public:
   X(int x): x(x) {}
   bool operator ==(const X &other) const
   { return x == other.x; }
};

Other answers have already pointed you to a systematic library based on clever templates &c for such purposes (boost) and to the answer for your second question (once you have <, all needed comparisons, including equality, can be easily implemented in the std library code in terms of <).

请你别敷衍 2024-08-12 10:03:11

请参阅 Wikipedia 上的巴顿·纳克曼技巧。它利用 CRTP 习惯用法 和内联友元函数。

See Barton Nackman trick on Wikipedia. It makes use of the CRTP idiom and inline friend functions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文