Boost :: Tuples vs Structs返回值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

我会用这个

struct divide_result {
    int quotient;
    int remainder;
};

使用元组,你会有

typedef boost::tuple<int, int> divide_result;

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

struct divide_result {
    int results[2]; // 0 is quotient, 1 is remainder, I think
};

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

提问于
用户回答回答于

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

struct A
{
  int a;
  int b;
};

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

void foo (A const & a)
{
  // ...
}

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

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

struct A
{
  int a;
  int b;
  int c;
};

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

与元组对比一下:

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,因此会生成错误,使你可以为第三个参数指定正确的值。

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

void incrementValues (boost::tuples::null_type) {}

template <typename Tuple_>
void incrementValues (Tuple_ & tuple) {
   // ...
   ++tuple.get_head ();
   incrementValues (tuple.get_tail ());
}
用户回答回答于

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

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

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

所属标签

可能回答问题的人

  • 找虫虫

    0 粉丝0 提问5 回答
  • 骑牛看晨曦

    4 粉丝522 提问4 回答
  • 爸爸

    腾讯 · 客户端安全 (已认证)

    3 粉丝4 提问4 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问4 回答

扫码关注云+社区

领取腾讯云代金券