【发布时间】:2018-11-01 16:39:44
【问题描述】:
有一个流行的成语使用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) 对,这背后有什么原因吗?
【问题讨论】:
-
与“复制成员列表”是指必须复制代码中的参数列表吗?因为
tie没有复制。那我不明白你的问题。如果你愿意,当然你可以写一个MakeTie,虽然你需要为每种类型写一个不同的 -
C++ 中没有必要的反射机制允许您列出所有数据成员。
-
在你链接的代码中我也没有看到
tie( some parameters) < tie (exact same parameters),而是tie (some parameters) < tie (some other parameters),所以我认为这个辅助函数不会真正有帮助,它宁愿混淆代码恕我直言 -
为什么没有更多的项目使用这个成语?我们只能推测。我认为这个问题只有固执己见的答案。
-
make_tie不是一个东西,因为没有办法构建它。 C++ 中没有反射,因此您必须自己编写。我见过一个私有的as_tuple辅助函数用来代替tie