次のコードを使用して、関数の配列引数のサイズを取得できることを知っている場合と知らない場合があります。
template<typename DataType, size_t SIZE>
void SortingAlgorithm(DataType (&array)[SIZE])
{
...
return;
}
ここで、SIZEを使用して配列内の要素の数を表すことができるため、関数を使用するプログラマーは、長さを明示的に渡さずに配列を引数として渡すことができます。たとえば、プログラマーはこれを行うことができます。
SortingAlgorithm( arrayToBeSorted ); //the length is not passed here, which is fine
反復スタイルで比較的簡単に実装できるアルゴリズムの場合、これは問題ありません。しかし、私は再帰的な他のアルゴリズムでこれを実行しようとしました。それぞれのコードは次のようになります。
template<typename DataType, size_t SIZE>
void SortingAlgorithm(DataType (&array)[SIZE])
{
DataType newArray[SIZE];
memcpy(newArray,array, SIZE); //copy to a new array
SortingAlgorithm( newArray );
...
return;
}
しかし、これは、プログラムが異なる引数型を予期し、型変換が失敗し、newArray配列のSIZE指定子を複数回型キャストしようとしたことを示すたびにエラーをスローし、プログラムは失敗します。ただし、次のように再帰呼び出しを行う前に、実際の値を使用してnewArrayのサイズを定義しても、これらのエラーは発生しません。
DataType newArray[10]; //arbitrary number, but the compiler accepts this.
可変サイズの配列がエラーを引き起こすのはなぜですか?また、入力として配列を受け入れるが、関数呼び出し内で毎回配列の長さを決定できるため、引数として配列の長さを必要としない再帰的アルゴリズムを実装する方法はありますか?