我会用这个
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
};
那么,元组相对于结构的优点有哪些可以弥补模糊性?
发布于 2018-06-15 14:34:21
你不具有结构的元组的一个特征就是它们的初始化。考虑下面的内容:
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 ());
}
https://stackoverflow.com/questions/-100000289
复制相似问题