在API设计中,我应该何时更喜欢长度为2 std :: tuple?

ein*_*ica 0 c++ idiomatic c++11 stdtuple std-pair

我正在写一个小型库,它有一些API函数返回两个东西(不同类型).我宁愿不为此声明一个结构; 所以我想回来一个std::pair<foo, bat>.但是 - 也许在这些现代时代我宁愿回来std::tuple<foo, bar>呢?

更一般地说,什么时候应该优先选择元组,何时配对更合适的构造?

Yak*_*ont 6

你应该为它声明一个结构.

get<0>(x)get<1>(x),或甚至-C交++ 11的get<Foo>(x)get<Bar>(x),是不太有意义和/或比惯用的x.foox.bar.

tuples最适合按顺序识别的非均匀打字的东西.

pairs是tuple在C++ 11之前编写的.

两者pairtuple(array虽然我们在它)都是元组式的,因为他们支持std::tuple_sizeget<N>.

std库中被认为是一个错误,许多类型使用pair而不是具有正确命名字段的结构.即,如果map使用struct KV{ Key key; Value value; },它会更好.

现在,元编程支持KV作为通用对也会很好.所以,tuple_sizeget<0>等,但扔掉命名字段通常是一个坏主意.名字有力量.

使用C++ 17,简单的structs开始使用结构化绑定,即使你不使它们"像元组一样".

如果你确实拥有其身份由非统一类型的顺序决定的东西,那tuple就是要走的路. pair是一种近乎传统的类型.有一些优点可以pair结束tuple,但tuple继续改进以删除它们(如隐式初始化tuple).