2012-04-12 8 views
5

배열을 템플릿 유형으로 전달해야합니다. 어떻게 그것을 달성 할 수 있습니다. 예를 들어, 나는 이런 것을 원한다.배열을 템플릿 유형으로 전달하십시오.

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

나는 배열 대신에 무엇을해야합니까? 배열이이라고 가정합니다. 또한 std::vector 또는 배열에 대한 포인터를 원하지 않습니다. 나는 전체 배열을 원한다고 말하면서 int 배열 [32]이라고 할 수있다.

+2

당신이 C++ (11) '표준을 사용하는 경우 :: 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[10] 완전히 다른 유형 int[11]에서 것을 이해한다, 당신은 Fifo<int[10]>을 만든 후에는 더 이상 여기 크기 11 (9)의 배열을 저장할 수 없습니다 다음

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

} 

처럼 사용합니다.

1

글쎄 해결책을 찾았습니다. 아래처럼 구조체에 배열을 래핑 할 수 있습니다.

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

그러면 다음과 같이 사용할 수 있습니다.

Fifo<my_array, Q_SIZE> f; 
2

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); 
} 
관련 문제