2012-04-12 11 views
5

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

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

私は配列の代わりに何を置くべき? の配列がであると仮定します。また、私はstd::vectorまたは配列へのポインタを必要としないことに注意してください。私は、基本配列全体を、int配列[32]と同等のものとしたい。

+2

あなたがC++ 11 'のstdを使用している場合:: array 'はすべきこと –

+0

@ user1018562あなたは前にあなたの配列をtypedefできますか?私は 'typedef int myArrayType [16]'を意味し、次にmyArrayTypeを渡します。 – qdii

+0

boost :: boost :: array Anycorn

答えて

4

これを試してみてください:このように

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"; 
} 
2

をあなたは配列型を渡したい場合はキューを作成するときに書くことができます

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の配列を格納することができないことを、理解する必要があります。

1

私は解決策を見つけました。私は以下のような構造体に配列をラップすることができます。

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

次に、次のように使用できます。 C++ 11に

Fifo<my_array, Q_SIZE> f; 
2

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); 
} 
関連する問題