2010-06-08 27 views
15

tôi cần phải làm một typedef như thế này.C++ typedef cho một phần mẫu

template< class A, class B, class C > 
class X 
{ 
}; 

template< class B, class C > 
typedef X< std::vector<B>, B, C > Y; 

Tôi chỉ thấy rằng nó không được hỗ trợ trong C++. Ai đó có thể tư vấn cho tôi về cách để đạt được cùng một thông qua phương tiện thay thế?

Cảm ơn, Gokul.

+1

thể trùng lặp của (http [typedef templated?]: // stackoverflow .com/questions/649718/templated-typedef) – Troubadour

Trả lời

18

Nếu bạn có một C++ 0x/C++ 1x trình biên dịch, mà sẽ được cho phép với một cú pháp hơi khác nhau (có vẻ như là nếu trình biên dịch không còn hỗ trợ tính năng này):

template <typename B, typename C> 
using Y = X< std::vector<B>, B, C >; 

bạn có thể sử dụng các kỹ thuật khác, như xác định một loại kèm theo trong một struct templated (như Pieter gợi ý), hoặc lợi dụng thừa kế (tránh nếu có thể):

template <typename B, typename C> 
class Y : public X< std::vector<B>, B, C > {}; 
+1

Nó làm cho tôi tự hỏi mặc dù * tại sao * nó chưa được hỗ trợ. Có khó khăn hơn nhiều so với di chuyển ngữ nghĩa, 'tự động gõ, mẫu variadic hoặc một số công cụ khác mà ít nhất có vẻ khó thực hiện? Nhưng tôi không có nhiều kinh nghiệm trong việc xây dựng một trình biên dịch, trực giác của tôi về những thứ cứng có thể là * cách * tắt :). – Pieter

+2

Tôi nghĩ các phần khác nhau của tiêu chuẩn đã được quyết định vào những thời điểm khác nhau - các nhà sản xuất trình biên dịch phải tự tin một cách hợp lý một tính năng sẽ không thay đổi trước khi tiêu chuẩn cuối cùng ra mắt vào năm 2011 trước khi họ dành thời gian phát triển nó. lịch phát hành của họ. – AshleysBrain

+0

Tôi là người của tương lai. Dường như nó được hỗ trợ trong các trình biên dịch chính hiện nay. – imallett

15

Bằng cách đặt nó trong cấu trúc. Ý tưởng này được gọi là bí danh mẫu và là một phần của tiêu chuẩn C++ 0x (the proposal). Nhưng một công việc xung quanh được đưa ra bởi:

template<class B, class C> 
struct Y { 
    typedef X<std::vector<B>, B, C> type; 
}; 

và sử dụng Y<B, C>::type làm loại mong muốn của bạn.

Và bạn có thể có khuynh hướng nghĩ rằng gcc4.5 hoặc VS2010 có thể đã hỗ trợ nó, như trường hợp với một tập con lớn của C++ 0x, nhưng tôi phải làm bạn thất vọng, như chúng ta vẫn chưa được hỗ trợ:).

+2

Lưu ý rằng điều này có thể yêu cầu sử dụng của từ khóa 'typename' nếu' B' hoặc 'C' là các tham số mẫu của chúng. –

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