13

const配列引数をC++のメソッドに渡せるようにしたいと思います。

配列をメソッドに渡すときは、配列の最初の項目にポインターを渡すのと同じなので、ポインターを使用するのが簡単な方法です。

void myMethod(int * const inTab)

ただし、配列がある方がよい場合もあります。たとえば、配列のサイズを記述できます。

4

5 に答える 5

24

配列サイズをとるテンプレートを使用できます:http://ideone.com/0Qhra

template <size_t N>
void myMethod ( const int (& intArray) [N] )
{
    std::cout << "Array of " << N << " ints\n";
    return;
}

編集:コードの膨張を回避するための可能な方法は、実際の作業を行うポインターとサイズを受け取る関数を使用することです。

void myMethodImpl ( const int * intArray, size_t n );

そしてそれを呼び出す簡単なテンプレートで、簡単にインライン化できます。

template <size_t N>
void myMethod ( const int (& intArray) [N] )
    { myMethodImpl ( intArray, N ); }

もちろん、これが常にインライン化されていることをテストする方法を見つける必要がありますが、安全性と使いやすさは得られます。そうでない場合でも、比較的低コストでメリットが得られます。

于 2012-07-18T14:32:55.137 に答える
8

3.9.3:2による

配列型に適用されるcv修飾子は、配列型(8.3.4)ではなく、配列要素型に影響します。

および8.3.4:1

「NTのcv-qualifier-seq配列」の形式はすべて、「N cv-qualifier-seq Tの配列」に調整され、同様に「Tの未知の境界の配列」に調整されます。

また、8.3.5:5による

各パラメータのタイプを決定した後、「Tの配列」または「Tを返す関数」タイプのパラメータは、それぞれ「Tへのポインタ」または「Tを返す関数へのポインタ」に調整されます。

つまり、配列パラメーターを受け取る関数内では、パラメーターの型は実際にはポインターであり、3.9.3:2のため、ポインターはcv修飾されていません。

void foo(const int parameter[10]) {
    parameter = nullptr;   // this compiles!
}

8.3.5:5の別の句があるため、これは関数自体のタイプには影響しません。

パラメータタイプのリストを作成した後、パラメータタイプを変更するトップレベルのcv修飾子は、関数タイプを形成するときに削除されます。

したがって、cv修飾子を使用して配列を渡すことができるようにする場合は、参照する必要があります。

void foo(const int (&parameter)[10]);
于 2012-07-18T14:58:49.720 に答える
5

それがあなたが尋ねたものであるかどうかはわかりませんが、多分それはあなたが探していたものです

void func (const int array[10])
{
    //array[0] = 12345; // this wouldn't compile, so 'const' works
}

int main ()
{
    int array[10];
    func(array);
}
于 2012-07-18T14:38:04.107 に答える
4

配列のサイズが必要な場合:

template < std::size_t Size >
void myMethod( const int ( &inTab )[ Size ] );
于 2012-07-18T14:29:38.667 に答える
0

試すstd::vector

void myMethod(const std::vector<int> &inTab);
于 2021-12-10T15:01:23.643 に答える