7

変数に応じて、さらに使用するために SeedPositions32 または SeedPositions16 配列を選択する必要があります。ポインターがこれを許可すると思っていましたが、シードして機能させることはできません。C++11 std::array へのポインターをどのように宣言しますか? 私は以下を試しました。

array<int>* ArrayPointer;
//array<typedef T, size_t Size>* ArrayPointer;
array<int,32> SeedPositions32 = {0,127,95,32,64,96,31,63,16,112,79,48,15,111,80,
                               47,41,72,8,119,23,104,55,87,71,39,24,7,56,88,103,120};
array<int,16> SeedPositions16 = {...}
4

4 に答える 4

16

std::arrayサイズのテンプレート パラメータがあります。std::arrayサイズの異なる2 つのテンプレート インスタンス化は、異なるタイプです。そのため、異なるサイズの配列を指すポインタを持つことはできません (void*ワームの独自の缶を開くトリックを除けば)。

クライアント コードにテンプレートを使用することも、std::vector<int>代わりに使用することもできます。

例えば:

template <std::size_t N>
void do_stuff_with_array(std::array<int, N> the_array)
{
  // do stuff with the_array.
}

do_stuff_with_array(SeedPositions32);
do_stuff_with_array(SeedPositions16);

データへのポインターも取得できることに注意してください。

int* ArrayPtr =  SeedPositions32.data();

しかし、ここではサイズ情報が失われています。個別に追跡する必要があります。

于 2014-04-09T08:46:49.933 に答える
2

彼の答えで、juanchopanza は、あなたが望むものが機能しない理由を非常によく説明しました。

問題は、なぜそれをしたいのですか?std::array<int,32>の代わりに(へのポインタ) を使用する方法はありませんstd::array<int,16>

のポイントは、コンパイル時std::array<>に要素の数を追跡することです(また、小さな固定サイズの配列のメモリ割り当てを回避することもできます)。要素の数を実行時に管理したい場合は、おそらく, butを使用しないでください。std::array<>std::vector

基になるデータへのポインターを取得し (std::array::data()他の回答で提案されているように使用)、要素の数を自分で追跡するという代替手段は、やや危険であり、実際にはお勧めできません。問題は、ポインターがぶら下がっていないことを確認する必要があることです。

最後に、考えられるユースケースが見つかりません。array<int,32>ポインターを使用するには、とarray<int,16>オブジェクトの両方を宣言する必要がありますが、どちらか一方だけを使用してください。array<int,32>32 個すべてが必要でない場合は、単純に a を宣言して、最初の 16 個の要素のみを使用してみませんか?

于 2014-04-09T09:20:18.100 に答える