- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有一个流行的习语使用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)
对,这背后有什么原因吗?
最佳答案
首先,如果您的类(class)有太多成员以至于加倍 tie
是有问题的,那么您可能还是有设计味道。
我会同意这有点烦人,但请记住,这不是tie
存在的原因。没有“领带
”这样的东西; “tie”在这里是一个动词,一种描述表达式如何“捆绑在一起”成为实际引用元组的方式。
您当然可以编写自己的 tie
替代品,它知道您类(class)的所有相关成员,这样就不需要写两次。您可以将其称为 members_as_tuple
。是否要这样做取决于您,就像是否制作任何函数来避免某些特定的重复代码一样取决于您。
当然,如果没有反射,在一般情况下 C++ 无法为您完成此操作,因此这就是为什么没有提供开箱即用的工具的原因。
tl;dr:您已经展示了最好的(唯一的?)方法,但我不会称之为 make_tie
。
至于为什么人们没有更多地这样做,嗯,这是无法回答的。他们可能只是没有想到它,或者认为他们不需要它,而且可能是对的。
关于c++ - 为什么 make_tie 不是一回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53105609/
有一个流行的习语使用std::tie实现比较运算符: // foo.h struct Foo { int a, b; string c; bool operator<(const Foo&
我是一名优秀的程序员,十分优秀!