35

次のような関数に配列の参照を渡すことができます。

void f(int (&a)[5]);

int x[5];
f(x);     //okay
int y[6];
f(y);     //error - type of y is not `int (&)[5]`.

またはさらに良いことに、関数テンプレートを書くことができます:

template<size_t N>
void f(int (&a)[N]); //N is size of the array!

int x[5];
f(x);     //okay - N becomes 5
int y[6];
f(y);     //okay - N becomes 6

今私の質問は、関数から配列の参照を返す方法ですか?

関数から次の型の配列を返したい:

int a[N];
int a[M][N];
int (*a)[N];
int (*a)[M][N];

whereMNはコンパイル時に認識されます!

関数との間で配列のコンパイル時の参照を渡したり返したりするための一般的なルールは何ですか? int (*a)[M][N]型の配列の参照を関数に渡すにはどうすればよいですか?

編集:

Adamのコメント:int (*a)[N]配列ではなく、配列へのポインタです。

はい。しかし、1 つの次元はコンパイル時にわかっています。コンパイル時にわかっているこの情報を関数に渡すにはどうすればよいでしょうか?

4

6 に答える 6

46

関数から配列への参照を返したい場合、宣言は次のようになります。

// an array
int global[10];

// function returning a reference to an array
int (&f())[10] {
   return global;
}

配列への参照を返す関数の宣言は、配列への参照である変数の宣言と同じように見えますが、関数名の後に が続き、()パラメータ宣言を含む場合があります。

int (&variable)[1][2];
int (&functionA())[1][2];
int (&functionB(int param))[1][2];

このような宣言は、typedef を使用してより明確にすることができます。

typedef int array_t[10];

array_t& f() {
   return global;
}

本当に混乱させたい場合は、配列への参照を受け取り、そのような参照も返す関数を宣言できます。

template<int N, int M>
int (&f(int (&param)[M][N]))[M][N] {
   return param;
}

配列へのポインター*は同じように機能しますが、&.

于 2011-03-22T23:12:52.827 に答える
9

関数から配列を返すことはできません。

8.3.5/6:

関数は、型配列または関数の戻り値の型を持ちませんが、型ポインターまたはそのようなものへの参照の戻り値の型を持つ場合があります。

編集:構文が気に入るはずです:

int (&bar()) [5] {
  static int x[5];
  return x;
}


int (* & bar()) [6][10] {
    static int x[6][10];
    static int (*y)[6][10] = &x;
    return y;
}
// Note - this returns a reference to a pointer to a 2d array, not exactly what you wanted.
于 2011-03-22T23:07:42.300 に答える
3

Erik が述べたように、関数から配列を返すことはできません。構文は非常に複雑ですが、ポインターまたは参照を返すことができます。

// foo returns a pointer to an array 10 of int
int (*foo(float arg1, char arg2))[10] { ... }

// bar returns a reference to an array 10 of int
int (&foo(float arg1, char arg2))[10] { ... }

配列型の typedef を作成することを強くお勧めします。

// IntArray10 is an alias for "array 10 of int"
typedef int IntArray10[10];

// Equivalent to the preceding definitions
IntArray10 *foo(float arg1, char arg2) { ... }
IntArray10 &bar(float arg1, char arg2) { ... }
于 2011-03-22T23:14:17.090 に答える
1

sthによる細かい回答の補足として、配列参照を返す定数メソッドでクラスを宣言する方法を次に示します。

class MyClass
{
public:
    const int (&getIntArray() const)[10];
};
于 2016-01-27T13:41:55.257 に答える