3

最近投稿した他の 2 つの質問の延長である質問があります。

B および A 配列と B が既に定義されている B=f(A) の実装

移動代入による B=f(A) 構文の実装

array があるとしAます。次のMatlabのような構文を有効にすることにより、他の2つの配列とにf作用して返す関数を作成したいと思いますABC

[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;

 }

この特定のケース (2 つの出力のみ) をstd::tuple変更make_tupleする場合もstd::pair、すべてが機能します。std::make_pair

4

1 に答える 1

5

一般に、複数の値を返したい場合は、C++ ではすぐに使用できないため、多少の回避策を講じる必要があります。

std::pair最初のオプションは、両方の値を含むを返すことです。std::tie次のように、C++ 11 が利用できる場合は、return ステートメントで使用できます。

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

(注: C++1std::tupleにも 3 つ以上の値があります。)

または、参照によって 2 つのターゲット変数を渡すこともできますが、関数呼び出しは次のようになります (C++11 なしで動作します)。

f(A, B, C);

関数呼び出しをより「冗長」に見せるには (コードのこの 1 行を見ただけではf変更がわからないと嫌う人もいます)、参照の代わりにポインターを使用することもできます。次に、関数呼び出しは次のようになります。BC

f(A, &B, &C);

別のオプションは、複数の戻り値に単純な「コンテナー」を使用することです。これは、単純なペアまたはタプルが値に特定の意味を与えない場合に特に役立ちます。最良のオプションは、これを呼び出すコードで一貫して使用することです(別個の配列と をf使用しないでください)。これは、コード設計の残りの部分にうまく適合する場合にのみ使用してください。BC

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

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