2

以下では:

int c[10] = {1,2,3,4,5,6,7,8,9,0};

printArray(c, 10);

template< typename T >
void printArray(const T * const array, int count)
{
    for(int i=0; i< count; i++)
        cout << array[i] << " ";
}

テンプレート関数の関数シグネチャが[]を使用して配列である配列を参照しない理由は少し混乱しているので、。のようになりconst T * const[] arrayます。

テンプレート関数のシグネチャから、配列以外の変数だけでなく、配列が渡されていることをどのように判断できますか?

4

3 に答える 3

9

はっきりとは言えません。ドキュメントを読んだり、関数パラメータの名前から理解したりする必要があります。ただし、固定サイズの配列を扱っているので、次のようにコーディングできます。

#include  <cstddef> // for std::size_t

template< typename T, std::size_t N >
void printArray(const T (&array)[N])
{
    for(std::size_t i=0; i< N; i++)
        cout << array[i] << " ";
}

int main()
{
  int c[] = {1,2,3,4,5,6,7,8,9,0}; // size is inferred from initializer list
  printArray(c);
}
于 2012-12-10T22:22:41.643 に答える
5

配列にはサイズがあります。配列への参照を作成するには、サイズを静的に指定する必要があります。例えば:

template <typename T, std::size_t Size>
void printArray(T const (&array)[Size]) {
    ...
}

この関数は参照によって配列を取得し、そのサイズを決定できます。

于 2012-12-10T22:22:54.417 に答える
0

次のようなことを試すことができます。

template< std::size_t N>
struct ArrayType
{
    typedef int IntType[N];
};

ArrayType<10>::IntType content = {1,2,3,4,5,6,7,8,9,0};

template< std::size_t N >
void printArray(const typename ArrayType<N>::IntType & array)
{
    //for from 0 to N with an array
}
void printArray(const int * & array)
{
    //not an array
}

ラクスヴァン。

于 2012-12-10T22:29:48.890 に答える