3

我有一个问题是我最近发布的其他两个问题的延伸:

实现 B=f(A),B 和 A 数组以及 B 已经定义

通过移动赋值实现 B=f(A) 语法

假设我有一个数组A。我想通过启用以下类似 Matlab 的语法来创建一个f作用于并A返回两个其他数组的函数BC

[B,C]=f(A);

在 C++ 中可能吗?

LEEMES 回答后的解决方案

#include <tuple>
using std::tie;

std::tuple<TypeOfB,TypeOfC> f(const Matrix<T1>&a,const Matrix<T2>&a) {

    // Instruction declaring and defining B_temp and C_temp

    return std::make_tuple(B_temp,C_temp); }

int main( int argc, char** argv) 
{

    // Instruction declaring A, B and C

    tie(B,C)=f(A);

    // STUFF

    return 0;

 }

一切都在改变std::tuple和改变make_tuplestd::pairstd::make_pair适用于这种特殊情况(只有两个输出)。

4

1 回答 1

5

一般来说,如果你想返回多个值,你必须做一些小工作,因为 C++ 不允许这个开箱即用。

第一个选项是返回std::pair包含两个值的 a。然后,std::tie如果您有可用的 C++11,则可以在 return 语句中使用,如下所示:

std::tie(B, C) = f(A);

(注意:C++11 也有std::tuple两个以上的值。)

或者您可以通过引用传递两个目标变量,但随后函数调用变成这样(不使用 C++11 也可以工作):

f(A, B, C);

为了使函数调用看起来更“冗长”(有些人不喜欢你无法通过查看这一行代码来判断f更改) B,您还可以使用指针而不是引用。C然后函数调用将如下所示:

f(A, &B, &C);

另一种选择是为您的多个返回值使用一个简单的“容器”。如果一个简单的对或元组没有赋予这些值特定的含义,这尤其有用。最好的选择是在调用的代码中一致地使用它f(不要使用单独的数组BC)。仅当它很好地适合您的代码设计的其余部分时才使用它。

struct TwoArrays {
    int B[100];
    int C[100];
};

TwoArrays result = f(A);
于 2013-05-04T20:54:27.370 回答