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

C++ 为什么打领带不是一件事?,c++,c++14,stdtuple,C++,C++14,Stdtuple,使用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); } //foo.

使用
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);
}
//foo.h
结构Foo{
INTA,b;
字符串c;

bool操作符首先,如果您的类有太多的成员,因此将
tie
合并是有问题的,那么您可能会有一种设计的味道

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

当然,你可以为
tie
编写你自己的替换,它知道你的类的所有相关成员是如何工作的,这样就不需要写两次。你可以称它为
members\u as\u tuple
。这取决于你是否想这样做,就像取决于你是否制作任何函数来避免某些特定的du一样折叠代码

当然,在没有反射的情况下,C++不能在一般情况下为你做这件事,这就是为什么这种工具不能被提供出来的原因。 tl;dr:你已经展示了最好的(唯一的?)方法,但我不会称之为
make\u tie



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

首先,如果你的类成员太多,以至于把
tie
合二为一是有问题的,那么你可能还是有设计的味道

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

当然,你可以为
tie
编写你自己的替换,它知道你的类的所有相关成员是如何工作的,这样就不需要写两次。你可以称它为
members\u as\u tuple
。这取决于你是否想这样做,就像取决于你是否制作任何函数来避免某些特定的du一样折叠代码

当然,在没有反射的情况下,C++不能在一般情况下为你做这件事,这就是为什么这种工具不能被提供出来的原因。 tl;dr:你已经展示了最好的(唯一的?)方法,但我不会称之为
make\u tie



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

关于“复制成员名单”你是说你必须复制代码中的参数列表吗?因为<代码> TIA//COD>不做拷贝。然后我不理解你的问题。如果你喜欢,当然你可以写一个<代码> MaGeTe<代码>,虽然你需要一个不同的类型,但是在C++中没有必要的反射机制,你可以列出所有的数据MEM。另外,在您链接的代码中,我没有看到
tie(某些参数)
而是
tie(某些参数) >我不认为这个助手函数会有帮助,它会混淆代码,而不是使用这个成语来增加更多的项目。我们只能猜测。我认为这个问题只有自以为是的答案。<代码> MaMaGyTy[/COD> ]不是一件事,因为没有办法来构建它。C++中没有反射,所以你必须要写。我见过一个私有的
as_tuple
helper函数用来代替
tie
“复制成员列表”你是说你必须复制代码中的参数列表吗?因为<代码> TIA//COD>不做拷贝。然后我不理解你的问题。如果你喜欢,当然你可以写一个<代码> MaGeTe<代码>,虽然你需要一个不同的类型,但是在C++中没有必要的反射机制,你可以列出所有的数据MEM。另外,在您链接的代码中,我没有看到
tie(某些参数)
而是
tie(某些参数) >我不认为这个助手函数会有帮助,它会混淆代码,而不是使用这个成语来增加更多的项目。我们只能猜测。我认为这个问题只有自以为是的答案。<代码> MaMaGyTy[/COD> ]不是一件事,因为没有办法来构建它。C++中没有反射,所以你必须要写。我见过一个私有的
as tuple
helper函数用来代替
tie
。然后一些成员可能不相关。或者可能指向/包含相关的成员。或者源顺序可能不是比较顺序…@Deduplicator Right。
成员as tuple\u引用
,FTFY.IDK,可能
std::tie(a,b,c)
内联会更好。也许
自动绑定()const;
在某些流行的编译器上根本不会内联。@Abyx:这也是可以想象的……然后一些成员可能不相关。或者可能指向/包含相关的成员。或者源顺序可能不是比较顺序…@Deduplicator Right。
成员作为引用的元组
,FTFY.IDK,可能
std::tie(a,b,c)
内联会更好。也许在某些流行的编译器上,
auto TieUp()const;
根本不会内联。@Abyx:这也是可以想象的
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 { ... }