2011-08-14 56 views
9

Trong giấy đề xuất Mẫu C++ 0x Variadic Link có một ví dụ về một lớp hỗ trợ một số thứ nguyên tùy ý. Tôi đã sao chép nó bên dưới:Mẫu biến thể Mảng đa chiều Mảng

template<typename T, unsigned PrimaryDimension, unsigned... Dimensions> 
class array { /* implementation */ }; 

array<double, 3, 3> rotation matrix; // 3x3 rotation matrix 

Đáng buồn là việc triển khai không được cung cấp. Vì tôi tương đối mới với các mẫu variadic, tôi sẽ quan tâm đến việc triển khai vùng chứa này.

Nhờ bất kỳ ai có thể cung cấp triển khai đơn giản.

Trả lời

15

Đây là một thực hiện rất đơn giản (biên soạn với gcc4.6.1) diễn tả đệ quy có liên quan trong việc có được kiểu mảng đúng - nếu có một số chi tiết thực hiện cụ thể khác mà bạn quan tâm, xin vui lòng cho chúng tôi biết:

template<class T, unsigned ... RestD> struct array; 

template<class T, unsigned PrimaryD > 
    struct array<T, PrimaryD> 
{ 
    typedef T type[PrimaryD]; 
    type data; 
    T& operator[](unsigned i) { return data[i]; } 

}; 

template<class T, unsigned PrimaryD, unsigned ... RestD > 
    struct array<T, PrimaryD, RestD...> 
{ 
    typedef typename array<T, RestD...>::type OneDimensionDownArrayT; 
    typedef OneDimensionDownArrayT type[PrimaryD]; 
    type data; 
    OneDimensionDownArrayT& operator[](unsigned i) { return data[i]; } 
}; 

int main() 
{ 
    array<int, 2, 3>::type a4 = { { 1, 2, 3}, { 1, 2, 3} }; 
    array<int, 2, 3> a5{ { { 1, 2, 3}, { 4, 5, 6} } }; 
    std::cout << a5[1][2] << std::endl; 

    array<int, 3> a6{ {1, 2, 3} }; 
    std::cout << a6[1] << std::endl; 

    array<int, 1, 2, 3> a7{ { { { 1, 2, 3}, { 4, 5, 6 } } }}; 
    std::cout << a7[0][1][2] << std::endl; 
} 
+0

Cảm ơn bạn đã trả lời, Faisal. Điều đó thật đáng kinh ngạc. Rất thanh lịch. Tôi hỏi chủ yếu là vì tôi có một thư viện mảng đa chiều kích thước cố định (Liên kết ở đây: http://code.google.com/p/fsma/) cung cấp các trình bao bọc mỏng xung quanh các mảng 2d và 3d tích hợp và tương tự như std: :mảng. Tôi đã tự hỏi làm thế nào để thực hiện một phiên bản cho phép cho một số tùy ý của các kích thước bằng cách sử dụng các mẫu variadic sau khi tôi đọc các giấy Ủy ban tiêu chuẩn trên chúng. Tôi đã không biết sức mạnh của các mẫu variadic cho đến khi tôi đọc câu trả lời của bạn! – Ricky65

+0

Đối với nhận xét 2011-Aug-14 của @ faisal-vali, tôi không chắc chắn những gì bạn đang cố gắng xây dựng. Sẽ không 'mẫu arrayX ' dịch thành một cái gì đó như 'arrayX ' cho 'long, 2, 3, 5 'như các tham số. Tham số variadic phải mở rộng đến một danh sách được phân tách bằng dấu phẩy, mà các giới hạn mảng lồng nhau không đủ điều kiện. – CTMacUser

+0

@CTMacUser Có tất nhiên bạn đúng - bình luận của tôi là không có ý nghĩa và nên bị ảnh hưởng. –