2012-04-12 34 views
5

Tôi cần phải vượt qua một mảng làm loại mẫu. Làm thế nào có thể đạt được nó. Ví dụ, tôi muốn một cái gì đó như thế này.Vượt qua một mảng làm loại mẫu

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

Tôi nên đặt gì thay cho mảng? Giả sử tôi cần một mảng int. Cũng lưu ý rằng tôi không muốn std::vector hoặc một con trỏ tới một mảng. Tôi muốn toàn bộ mảng cơ bản, một cái gì đó tương đương với nói int mảng [32].

+2

Nếu bạn đang sử dụng C++ 11 'std :: array 'nên thực hiện thủ thuật –

+0

@ user1018562 Bạn có thể gõ mảng trước của bạn không? Tôi có nghĩa là 'typedef int myArrayType [16]' và sau đó vượt qua myArrayType. – qdii

+0

nếu bạn đang sử dụng boost 'boost :: array ' – Anycorn

Trả lời

4

Hãy thử điều này:

Fifo<int[32], Q_SIZE> f; 

Như thế này:

#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

Nếu bạn muốn vượt qua mảng kiểu khi tạo hàng đợi bạn có thể viết

template <typename Array> 
struct Fifo; 

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

}; 

hoặc chỉ

template <typename Array> 
struct Fifo 
{ 
}; 

và sử dụng nó như

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

} 

Sau đó, bạn nên hiểu, rằng int[10] là loại hoàn toàn khác nhau từ int[11], và một khi bạn đã tạo Fifo<int[10]> bạn không thể lưu trữ ở đây mảng kích thước 11 hoặc 9 nữa.

1

Tôi đã tìm được giải pháp. Tôi có thể bọc mảng trong một cấu trúc, chẳng hạn như dưới đây.

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

Sau đó, tôi có thể sử dụng như sau.

Fifo<my_array, Q_SIZE> f; 
2

Chức năng std::end trong C++ 11 có quá tải cho các loại mảng thể hiện rõ điều này.
Dưới đây là một thực thể của nó:

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

Nếu bạn cần một đối tượng mà kết thúc tốt đẹp một mảng, một chức năng nhà máy templated sẽ giúp tạo ra 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); 
} 
Các vấn đề liên quan