代码之家  ›  专栏  ›  技术社区  ›  Abyx

为什么打领带不是一件事?

  •  0
  • Abyx  · 技术社区  · 7 年前

    有一个流行的成语是使用 std::tie 要实现比较运算符,请执行以下操作:

    // foo.h
    struct Foo {
      int a, b;
      string c;
    
      bool operator<(const Foo& rhs) const;
    };
    
    // foo.cc
    bool Foo::operator<(const Foo& rhs) const {
      return tie(a, b, c) < tie(rhs.a, rhs.b, rhs.c);
    }
    

    E.g. it's widely used in Chromium

    但是,它需要复制成员列表,所以为什么不编写一个助手函数:

    static auto MakeTie(const Foo& x) {
      return tie(x.a, x.b, x.c);
    }
    bool Foo::operator<(const Foo& rhs) const {
      return MakeTie(*this) < MakeTie(rhs);
    }
    
    // or, in foo.h
    auto MakeTie() const;
    // and in foo.cc
    auto Foo::MakeTie() const { ... }
    

    (顺便说一句,这种成员函数不能从任何其他翻译单元调用)

    那么,为什么我会看到成百上千这样的人 tie(a, b, c) < tie(copy-pasta) pairs,这背后有什么原因吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Lightness Races in Orbit    7 年前

    首先,如果你的班级有这么多的成员 tie 是有问题的,那么你可能会有设计的味道。

    倾向于认为这有点烦人,但请记住,这不是 领带 这就是生活。没有“a”这样的东西 领带 "; "“tie”这是一个动词,用来描述表达式是如何被“捆绑在一起”成一个实际的引用元组的。

    当然,你也可以自己写一个替代品 领带 这就知道你班上所有相关的成员是怎么写的,这样就不需要写两遍了。你可以称之为 members_as_tuple 1.你是否想那样做取决于你,正如你是否做出决定取决于你 任何 函数以避免某些特定的重复代码。

    当然,在没有反射的情况下,C++在一般情况下不能为你做这件事,这就是为什么这样的设施不能被提供出来的原因。

    tl;医生:你已经展示了最好的(只有?)很好,但我不会这么说 make_tie .


    至于人们为什么不多做这件事,那是无法回答的。他们可能只是没有想到,或者认为他们不需要它,而且可能是对的。

    推荐文章