9

テンプレート型として配列を渡す必要があります。どのようにそれを達成することができます。例えばこんなものが欲しい。

Fifo<array, Q_SIZE> f; // This is a queue of arrays (to avoid false sharing)

arrayの代わりに何を入れればよいですか? intの配列が必要だとします。std::vectorまた、配列へのポインターも必要ないことにも注意してください。基本的な配列全体、たとえばint array[32]と同等のものが必要です。

4

4 に答える 4

6

これを試して:

Fifo<int[32], Q_SIZE> f; 

このような:

#include <iostream>
template <class T, int N>
struct Fifo {
  T t;
};

int main () {
 const int Q_SIZE  = 32;
 Fifo<int[32],Q_SIZE> f;
 std::cout << sizeof f << "\n";
}
于 2012-04-12T17:10:05.507 に答える
3

C++ 11のstd::end関数には、これをうまく示す配列型のオーバーロードがあります。
可能な実装は次のとおりです。

template< class T, std::size_t N >
T* end(T(&array)[N]) {
    return array + N;
}

配列をラップするオブジェクトが必要な場合は、テンプレート化されたファクトリ関数がそれを作成するのに役立ちます:

template< class T, std::size_t N >
struct fifo {
    T(&array)[N];
};

template< class T, std::size_t N >
fifo<T,N> make_fifo(T(&array)[N]) {
    return Fifo<T,N>{ array };
}

int main() {
    int arr[] = { 1,2,3,4,5 };

    // Create object from array using template argument deduction
    auto fifo = make_fifo(arr);
}
于 2015-11-01T02:10:04.033 に答える
3

キューを作成するときに配列型を渡したい場合は、次のように書くことができます

template <typename Array>
struct Fifo;

template <typename T, int size>
struct Fifo<T[size]>
{

};

あるいは単に

template <typename Array>
struct Fifo
{
};

そしてそれを次のように使用します

int main()
{
    Fifo<int[10]> fa;

}

int[10]次に、それは とは完全に異なる型であることを理解する必要がありint[11]ます。一度作成 Fifo<int[10]>すると、サイズ 11 または 9 の配列をここに格納できなくなります。

于 2012-04-12T17:14:32.273 に答える
1

さて、私は解決策を見つけました。以下のように、配列を構造体でラップできます。

typedef struct
{
 int array[32];
} my_array;

その後、次のように使用できます。

Fifo<my_array, Q_SIZE> f; 
于 2012-04-12T17:16:40.140 に答える