2009-09-24 35 views
26

Tôi đang cố gắng để typedef hoặc unordered_map hoặc std :: map tùy thuộc vào việc có sẵn các thư viện TR1 hay không. Nhưng tôi không muốn chỉ định các tham số mẫu. Từ những gì tôi đã đọc cho đến nay, typedef'ing mẫu mà không có đối số là không thể cho đến khi chính thức c + + 0x tiêu chuẩn có sẵn. Vì vậy, không ai biết một cách giải quyết thanh lịch cho điều này?Typedef một lớp mẫu mà không cần chỉ định các tham số mẫu

#ifdef _TR1 
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments 
#else 
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments 
#endif 
+0

Xem câu hỏi rất gần đây: http://stackoverflow.com/questions/544842/c-typedef-ing-stl và các câu trả lời được cung cấp. Mẫu typedefs không phải là lệnh C++ hợp lệ –

+1

Benoit - Cảm ơn, đó chính xác là những gì tôi đang tìm kiếm –

+0

Câu hỏi rất giống nhau: http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class Nó có một câu lệnh khác câu trả lời không được đề cập ở đây: "mẫu bí danh" trong C++ 11 – Jayesh

Trả lời

36

Con đường tôi đã thấy điều này thực hiện là để quấn typedef trong một mẫu-struct:

template<typename KeyType, typename MappedType> 
struct myMap 
{ 
#ifdef _TR1 
    typedef std::tr1::unordered_map<KeyType, MappedType> type; 
#else 
    typedef std::map<KeyType, MappedType> type; 
#endif 
}; 

Sau đó trong mã của bạn, bạn gọi nó như vậy:

myMap<key, value>::type myMapInstance; 

Nó có thể là nhiều hơn một chút so với những gì bạn muốn, nhưng tôi tin rằng nó đáp ứng nhu cầu về tình trạng hiện tại của C++.

+3

Nó thực sự là cách thông thường để mô phỏng thiếu mẫu typedefs trong C++. Tuy nhiên, tôi đã đặt tên typedef là "type" thay vì "value", nó có vẻ đúng ngữ nghĩa hơn và nó thành ngữ hơn. –

+1

Mã được cập nhật, cảm ơn – fbrereto

4

Bạn phải sử dụng loại đầy đủ cho typedef.

Sử dụng macro #define thay thế.

+1

Đôi khi tốt nhất là nên quay trở lại theo cách cũ. Lập trình băng keo tốt nhất. –

+4

không may macro không tôn trọng phạm vi. – sellibitze

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