<分区>
我正在编写一个小型库,其中有一些 API 函数返回两个东西(不同类型)。我宁愿不为此声明一个结构;所以我正在考虑返回 std::pair<foo, bat>
.但是 - 也许在这些现代我更愿意返回 std::tuple<foo, bar>
相反?
更一般地说,什么时候应该优先使用元组而不是对,什么时候对是更合适的结构?
<分区>
我正在编写一个小型库,其中有一些 API 函数返回两个东西(不同类型)。我宁愿不为此声明一个结构;所以我正在考虑返回 std::pair<foo, bat>
.但是 - 也许在这些现代我更愿意返回 std::tuple<foo, bar>
相反?
更一般地说,什么时候应该优先使用元组而不是对,什么时候对是更合适的结构?
最佳答案
您应该为此声明一个结构。
get<0>(x)
和 get<1>(x)
,甚至是后 C++11 的 get<Foo>(x)
和 get<Bar>(x)
, 没有 x.foo
有意义和/或惯用或 x.bar
.
tuple
s 最适合按顺序标识的非统一类型的事物。
pair
s 是 tuple
这是在 C++11 之前编写的。
两者都是 pair
和 tuple
(和array
,而我们在这里)是类似元组的,因为它们支持std::tuple_size
和 get<N>
.
它被认为是 std
中的一个错误许多类型使用的库pair
而不是具有正确命名字段的结构。即,如果 map
二手 struct KV{ Key key; Value value; }
, 本来会更好。
现在,元编程支持 KV
作为通用对也很好。所以,tuple_size
和 get<0>
等等。但是丢弃命名字段通常不是一个好主意。名字有力量。
使用 C++17,简单 struct
让我们开始使用结构化绑定(bind),即使您没有让它们“像元组一样”。
如果你确实有一些东西的身份是由它们的非统一类型的顺序决定的,tuple
是要走的路。 pair
几乎是遗留类型。 pair
有一些优势在 tuple
,但是tuple
继续改进以删除它们(如 tuple
的隐式初始化)。
关于c++ - 在 API 设计中,什么时候我应该更喜欢长度为 2 的 std::tuple 而不是一对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41269629/