首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Boost :: Tuples vs Structs返回值?

Boost :: Tuples vs Structs返回值?
EN

Stack Overflow用户
提问于 2018-06-15 04:37:30
回答 2查看 0关注 0票数 0

我会用这个

代码语言:javascript
复制
struct divide_result {
    int quotient;
    int remainder;
};

使用元组,你会有

代码语言:javascript
复制
typedef boost::tuple<int, int> divide_result;

但是如果没有阅读你所调用函数的代码(或者评论,如果你足够愚蠢地信任它们),你不知道哪个int是商,反之亦然。这似乎相当...

代码语言:javascript
复制
struct divide_result {
    int results[2]; // 0 is quotient, 1 is remainder, I think
};

那么,元组相对于结构的优点有哪些可以弥补模糊性?

EN

回答 2

Stack Overflow用户

发布于 2018-06-15 13:35:16

元组在ML或Haskell等语言中非常有用。

在C ++中,它们的语法使得它们不那么优雅,但在以下情况下可能很有用:

  • 你有一个必须返回多个参数的函数,但调用者和被调用者的结果是“本地”的; 你不想为此定义一个结构
  • 你可以使用tie功能来做一个非常有限的模式匹配形式“a la ML”,比起使用同一个目的的结构更加优雅。
  • 他们带有预定义的<运营商,这可以节省时间。
票数 0
EN

Stack Overflow用户

发布于 2018-06-15 14:34:21

你不具有结构的元组的一个特征就是它们的初始化。考虑下面的内容:

代码语言:javascript
复制
struct A
{
  int a;
  int b;
};

除非你编写了一个make_tuple等价物或构造函数,然后使用这个结构作为输入参数,你首先必须创建一个临时对象:

代码语言:javascript
复制
void foo (A const & a)
{
  // ...
}

void bar ()
{
   A dummy = { 1, 2 };
   foo (dummy);
}

然而,维护会为我们的结构无论何种原因添加新成员:

代码语言:javascript
复制
struct A
{
  int a;
  int b;
  int c;
};

聚合初始化的规则实际上意味着我们的代码将继续编译而不会发生变化。因此我们不得不搜索这个结构的所有用法并更新它们,而不需要编译器的帮助。

与元组对比一下:

代码语言:javascript
复制
typedef boost::tuple<int, int, int> Tuple;
enum {
  A
  , B
  , C
};

void foo (Tuple const & p) {
}

void bar ()
{
  foo (boost::make_tuple (1, 2));  // Compile error
}

编译器不能用结果初始化“元组” make_tuple,因此会生成错误,使你可以为第三个参数指定正确的值。

最后,元组的另一个优点是它们允许你编写迭代每个值的代码。这根本不可能使用结构。

代码语言:javascript
复制
void incrementValues (boost::tuples::null_type) {}

template <typename Tuple_>
void incrementValues (Tuple_ & tuple) {
   // ...
   ++tuple.get_head ();
   incrementValues (tuple.get_tail ());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档