C ++中的多个返回值

时间:2014-02-10 15:22:49

标签: c++ c++11

所以,在相当一些阐述之前,我的问题出现了:

为什么C ++中还没有支持多个返回变量/值?

为了给你一些补充说明:

  • 什么(如果有的话)概念上是多个返回值和c ++的问题?
  • 编译器是否实现了从函数中复制值的方式,这使得多个返回值不可能/效率低下?

最近我和lua一起工作过,我开始问自己为什么C ++不允许从函数返回多个值/变量。为了说明,让我给你一个例子:

-- get the first four values of the fibonacci sequence
local function fib4()
    return 1, 1, 2, 3

local fib0, fib1, fib2, fib3 = fib4()

能够一次返回多个变量/值是一个非常有用的功能,我通常在C ++世界中通过创建有问题的函数返回的结构(主要是在包装器中收集变量)来模拟。如果一个人使用这种方法很多,那么每个包含一些变量的结构都会混杂在一起。这些结构中没有一个需要是一个实际的对象(并作为一个完整的对象实现)。在某种程度上,概念问题有点类似于使用结构来创建仿函数[而不是lambdas]:

  • 它破坏了地方
  • 它引入的对象不是概念上的对象,而是一个帮助者

在专业方面,它提高了代码的可读性:

struct point_three_dim_t {
    double x;
    double y;
    double z;
};

point_three_dim_t point = getCollisionPoint();

但是,先验地您不知道代表坐标的成员是否被命名为xyzfirstsecondthird。同样,您必须检查point_three_dim_t的定义方式。如果

,则情况并非如此
double x, y, z = getCollisionPoint();

是正确的语法。

使用C ++ 11,我们可以使用std::tuplestd::tie

在概念上实现相同的目标
std::tuple<double,double,double> getCollisionPoint();

// Using std::tie
double x, y, z;
std::tie( x, y, z ) = getCollisionPoint();

// Using std::tuple
std::tuple<double,double,double> point = getCollisionPoint();

这让我们更接近干净和本地代码,但是,我认为这两种语法都不像我在脚本语言中使用的那样具有吸引力。例如lua。

0 个答案:

没有答案