2014-11-10 32 views
6

mẫu cấu trúc thông thường có thể được chuyên môn hóa, ví dụ:sử dụng mẫu chuyên môn

template<typename T> 
struct X{}; 

template<> 
struct X<int>{}; 

C++ 11 đã cho chúng tôi mát using cú pháp mới để thể hiện mẫu typedefs:

template<typename T> 
using YetAnotherVector = std::vector<T> 

Có cách nào để xác định một chuyên môn mẫu cho các cấu trúc này bằng cách sử dụng các cấu trúc tương tự như các chuyên môn hóa cho các khuôn mẫu struct? Tôi đã thử các cách sau:

template<> 
using YetAnotherVector<int> = AFancyIntVector; 

nhưng nó mang lại lỗi biên dịch. Điều này có thể bằng cách nào đó?

+2

AFAIK, bạn cần một lớp phụ trợ cho nó. Ẩn đi một 'struct' chuyên biệt và sau đó tạo bí danh sử dụng lớp đó. – chris

+0

Không chắc chắn nếu tôi làm theo, có gì sai với 'typedef YetAnotherVector AFancyIntVector'? – slaphappy

+0

@ Mr.kbok: Sử dụng câu lệnh của bạn cùng với kết quả sử dụng trong một lỗi biên dịch "nhiều loại trong một khai báo" – gexicide

Trả lời

7

số

Nhưng bạn có thể xác định bí danh như:

template<typename T> 
using YetAnotherVector = typename std::conditional< 
            std::is_same<T,int>::value, 
            AFancyIntVector, 
            std::vector<T> 
            >::type; 

Hy vọng rằng sẽ giúp.

+0

'std :: conditional' bây giờ đã đá mông của tôi rất nhiều lần tôi đã mất đếm. – chris

+1

Có thể vì nó có tên * xấu *. 'if_else' (hoặc' if_c') sẽ tốt hơn? – Nawaz

+0

Ồ wow xấu xí, haha: D – Quentin

1

Không thể chuyên môn hóa chúng một cách rõ ràng hoặc một phần. [Temp.decls]/3:

Bởi vì một alias-khai không thể khai báo một mẫu-id, nó là không thể một phần hoặc một cách rõ ràng chuyên một mẫu bí danh.

Bạn sẽ phải trì hoãn các chuyên môn hóa cho các mẫu lớp học. Ví dụ. với conditional:

template<typename T> 
using YetAnotherVector = std::conditional_t< std::is_same<T, int>{}, 
              AFancyIntVector, 
              std::vector<T> >; 
+1

Nếu bạn đang sử dụng C++ 14, thì bạn cũng có thể tránh viết phần ':: value', vì' std :: is_same {} 'ngắn hơn! – Nawaz

+0

@Nawaz Tôi không chỉ quan tâm đến sự ngắn gọn mà còn rõ ràng. Dù sao, nếu mọi người thấy rằng có thể đọc được, tôi sẽ chỉnh sửa mã thích hợp – Columbo

+0

Umm, bạn quan tâm đến độ ngắn, đó là lý do tại sao bạn đã viết phiên bản '_t' của' std :: conditional'. – Nawaz

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