为什么make_tie不是一件事
Why make_tie is not a thing?
有一个流行的习惯用法使用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);
}
例如,它广泛用于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
加倍是有问题的,那么您可能会有设计气味。
我会倾向于同意这有点烦人,但请记住,这不是tie
存在的原因。没有所谓的"tie
";这里的"tie"是一个动词,用来描述表达式是如何"捆绑在一起"成为一个实际的引用元组的。
当然,您可以编写自己的tie
替代品,它知道类中所有相关成员的情况,因此不需要写两次。你可以称之为members_as_tuple
。是否要这样做取决于您,就像是否使成为任何函数以避免某些特定的重复代码一样。
当然,在没有反思的情况下,C++在一般情况下不能为您做到这一点,所以这就是为什么没有开箱即用地提供这样的功能。
tl;博士:你已经展示了最好的(唯一的(方法,但我不会称之为make_tie
至于为什么人们没有更多地这样做,嗯,这是无法回答的。他们可能只是没有想到,或者认为自己不需要它,而且可能是对的。
相关文章:
- 为什么make_tie不是一件事
- 不知道如何在家庭作业任务中实现一件事
- C++警告:编译指示在主文件中一次
- MFC Applicaton:如何将一组控件添加到单个文档应用程序中
- <<是一件C++的事情 - 相当于Java。
- 为什么会这样?堆,展示了一件事,然后又展示了另一件事
- 使用windows.h是一件好事吗?
- C++:关于加载 DLL 和调用函数的一件小事
- 虚拟析构函数会是一件坏事吗?
- 引用或复制结构的结构(已分配的memset)是一件有效的事情
- 我在wxPaint DC绘图中发现了一件奇怪的事情
- 通过多重私有继承扩展类-这是一件事吗
- 加工va_list一件一件
- 没有明显目标的std::cout在已发布代码中是一件不好的事情吗?
- 状态检查总是一件有效的事情吗
- 递归是一件坏事吗?在递归似乎最有用的地方,是否有更清晰或更有效的方法来解决问题?
- 使用 cpp 宏作为脚本语言是一件坏事吗?
- 指针强制转换以满足方法参数是一件危险的事情吗?
- 如何在Windows上每毫秒做一件事或做得更好
- 我做了一件阴暗的事情