c++ - 在 API 设计中,什么时候我应该更喜欢长度为 2 的 std::tuple 而不是一对?

标签 c++ c++11 std-pair idioms stdtuple

<分区>

我正在编写一个小型库,其中有一些 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 之前编写的。

两者都是 pairtuple (和array,而我们在这里)是类似元组的,因为它们支持std::tuple_sizeget<N> .

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

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

使用 C++17,简单 struct让我们开始使用结构化绑定(bind),即使您没有让它们“像元组一样”。

如果你确实有一些东西的身份是由它们的非统一类型的顺序决定的,tuple是要走的路。 pair几乎是遗留类型。 pair 有一些优势在 tuple ,但是tuple继续改进以删除它们(如 tuple 的隐式初始化)。

关于c++ - 在 API 设计中,什么时候我应该更喜欢长度为 2 的 std::tuple 而不是一对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41269629/

相关文章:

c++ - 使用模板和右值引用的重载解决方案

c++ - 在可变模板类中使用可变参数的显式特化 [MSVS '12: Nov. ' 12 CTP : error C3522]

C++ 设置搜索对元素?

c++ - 无效部署异常

c++ - 在 std::getline() 上使用任何字符作为分隔符

c++ - 如何安全地删除成员 std::mutex?

C++,不能将 2 个 vector 复制到一对 vector

c++ - 从值/引用映射分配给引用映射

c++ - 有没有办法让 Asio 在没有 Boost 的情况下工作?

c++ - 何时使用 pthread_mutex_t