2011-08-02 20 views
66

Làm cách nào để tôi typedef a template class? Một cái gì đó như:Làm thế nào để gõ một lớp mẫu?

typedef std::vector myVector; // <--- compiler error 

Tôi biết trong 2 cách:

(1) #define myVector std::vector // not so good 
(2) template<typename T> 
    struct myVector { typedef std::vector<T> type; }; // verbose 

Liệu chúng ta có bất cứ điều gì tốt hơn trong C++ 0x?

+0

Tại sao bạn muốn điều này? Trường hợp sử dụng là gì? –

+2

Tôi đang thực hiện một cái gì đó mà tôi có một số 'lớp mẫu' tham gia. Ban đầu, tôi sẽ thực hiện nó với các lớp tiêu chuẩn sau đó, tôi muốn chuyển sang các lớp tùy chỉnh của mình. Vì vậy, tôi muốn chuyển đổi đó phải đơn giản như thay đổi một 'typedef'. – iammilind

+0

Tôi phải đồng ý với David. Tại sao bạn muốn bí danh điều này? indirection là nguyên nhân hàng đầu cho mã không đọc được và không thể bảo trì. Tuy nhiên bạn đã đưa ra một lý do chính đáng, "Abstraction". Vấn đề với stl là API. Nó ngăn chặn tối ưu hóa cụ thể. Và giữ cùng một API và suy nghĩ rằng bạn có thể làm tốt hơn là xấu số. Nó không mất cả ngày để viết mảng phát triển của riêng bạn. chỉ cần làm điều đó và được thực hiện với nó. Hoặc chỉ sử dụng STL và tiếp tục cuộc sống của bạn. – Dan

Trả lời

108

Có. Nó được gọi là "alias template" và đó là một tính năng mới trong C++ 11.

template<typename T> 
using MyVector = std::vector<T, MyCustomAllocator<T>>; 

Cách sử dụng sau đó sẽ chính xác như bạn mong đợi:

MyVector<int> x; // same as: std::vector<int, MyCustomAllocator<int>> 

GCC đã hỗ trợ nó từ 4.7 và Clang kể từ 3.0.

+0

thật tuyệt, nhưng tôi không thể xác minh nó bằng gcc4.6 hoặc 4.5 (http://www.ideone.com/I8kbA). Bạn đang biên dịch với MSVC? – iammilind

+0

Bạn sẽ phải đợi C++ 0x để được chấp nhận trước. Sau đó, bạn sẽ phải đợi cho các trình biên dịch biên dịch thực sự thực hiện tiêu chuẩn. –

+1

"Bắt là không ai hỗ trợ nó được nêu ra." Đó là trong clang (svn trunk) kể từ một vài tháng. –

14

Trong C++ 03, bạn có thể kế thừa từ một lớp học (công khai hoặc riêng tư) để làm như vậy.

Bạn cần thực hiện thêm một chút công việc (Cụ thể, sao chép bản vẽ, toán tử gán) nhưng hoàn toàn có thể thực hiện được.

+2

@iammilind: một upvote hơn là bảo vệ khỏi downvotes chỉ làm cho họ có thể xảy ra nhiều hơn (* làm thế nào câu hỏi này có được để được upvoted! * Loại lý luận). Tôi là một trong những người công khai chống lại kế thừa từ các container STL ... nhưng trong trường hợp này không có nhiều lựa chọn thay thế. Tôi đoán lựa chọn tốt nhất là xem xét lại lý do tại sao bạn muốn làm điều này ngay từ đầu ... –

+0

@David Rodriguez đã đồng ý về lý do bạn muốn. Nếu bạn sử dụng rất nhiều các vectơ dựa trên một bộ cấp phát khác, thì các khuôn mẫu typedef sẽ rất được hoan nghênh. Mặc dù thừa kế riêng (ví dụ, được thực hiện trong điều khoản) là tốt, nhưng chỉ khi có một lý do để kế thừa từ nó ... mà thường không có. – dascandy

+0

Có lẽ không phải cho std :: vector , nhưng nói chung tôi có thể thấy nó có thể tiện dụng như thế nào. Giả sử bạn có một loại như LongName (hoặc một chuỗi dài các mẫu lồng nhau); sau đó có một tên shortcut có thể là tiện dụng. Nếu bạn sử dụng kiểu này cho một hoặc hai T khác nhau, thì bạn có thể gõ chúng.Nhưng nếu bạn có nhiều loại T, sau đó gõ tất cả chúng có thể được miễn là sử dụng tên trực tiếp, và chưa sử dụng tên là đau đớn dài. – bartgol

Các vấn đề liên quan