2012-04-12 54 views
5

我需要传递一个数组作为模板类型。如何实现它。例如,我想要这样的东西。传递一个数组作为模板类型

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

我应该把什么到位阵列的?假设我需要一组int。另外请注意,我不想要std::vector或指向数组的指针。我想要整个基本数组,相当于int array [32]

+2

如果您使用C++ 11'STD :: array '应该诀窍 – 2012-04-12 16:56:39

+0

@ user1018562你可以在之前的typedef数组吗?我的意思是'typedef int myArrayType [16]'然后传递myArrayType。 – qdii 2012-04-12 17:00:29

+0

如果您使用boost boost :: array ' – Anycorn 2012-04-12 17:00:46

回答

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; 

然后我可以使用它如下。

Fifo<my_array, Q_SIZE> f; 
2

std::end功能在C++ 11具有用于阵列类型的很好证明这一点的过载。
这里是一个可能实现的是:

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); 
} 
相关问题