2011-09-12 17 views
6

Tôi đang cố gắng để phần chuyên một đặc điểm cho mảng của phi chars:kế thừa từ một căn cứ enable_if'd

template<typename T> 
struct is_container : std::false_type {}; 

template<typename T, unsigned N> 
struct is_container<T[N]> 
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {}; 

Visual Studio 2010 mang lại cho tôi một C2039 (type là không có yếu tố enable_if ...). Tuy nhiên, không nên SFINAE chỉ ở dưới đây thay vì đưa ra một lỗi biên dịch? Hoặc SFINAE không áp dụng trong trường hợp này?

Tất nhiên tôi chỉ có thể tách các chuyên ngành cho phi char và char:

template<typename T> 
struct is_container : std::false_type {}; 

template<typename T, unsigned N> 
struct is_container<T[N]> : std::true_type {}; 

template<unsigned N> 
struct is_container<char[N]> : std::false_type {}; 

Nhưng tôi thực sự muốn biết lý do tại sao SFINAE không hoạt động trong trường hợp đặc biệt này.

+1

Vâng, tôi nghĩ rằng 'typename' là cần thiết trước' std :: enable_if', bởi vì loại phụ thuộc nhưng tôi sẽ không đặt nó như là câu trả lời vì đây chỉ là suy đoán! – AraK

+3

@Arak: Không. Tên tệp 'không được yêu cầu trong ngữ cảnh đó. Trong khi tìm kiếm lớp cơ sở, trình biên dịch loại trừ tất cả các loại không phải lúc đầu. Xem này: http://stackoverflow.com/questions/4347730/use-of-typename-keyword-with-template-function-parameters – Nawaz

+0

@Nawaz Cảm ơn :) – AraK

Trả lời

2

Kiểm tra chủ đề '3.1 Cho phép chuyên ngành lớp mẫu' tại http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

Edit: trong liên kết trường hợp boost.org chết ...

3.1 Kích hoạt mẫu chuyên ngành lớp Lớp mẫu chuyên ngành có thể bật hoặc bị vô hiệu hóa với enable_if. Cần thêm một tham số mẫu bổ sung cho các biểu thức kích hoạt. Tham số này có giá trị mặc định là void. Ví dụ:

template <class T, class Enable = void> 
class A { ... }; 

template <class T> 
class A<T, typename enable_if<is_integral<T> >::type> { ... }; 

template <class T> 
class A<T, typename enable_if<is_float<T> >::type> { ... }; 

Lập tức A với bất kỳ loại tích phân nào phù hợp với chuyên môn đầu tiên, trong khi bất kỳ loại dấu phẩy động nào phù hợp với loại thứ hai. Tất cả các loại khác khớp với mẫu chính. Điều kiện có thể là bất kỳ biểu thức boolean biên dịch nào phụ thuộc vào các đối số mẫu của lớp. Lưu ý rằng một lần nữa, đối số thứ hai để enable_if là không cần thiết; giá trị mặc định (void) là giá trị chính xác.

+2

Xin vui lòng gửi câu trả lời đầy đủ, vì nó là, bạn là vô ích nếu liên kết chết ... –

+0

Tôi rất nghi ngờ một liên kết để boost.org sẽ chết, nhưng dù sao tôi sẽ gửi một câu trả lời đầy đủ. –

+2

Vì vậy, tôi, mặc dù họ tổ chức lại trang web của họ một lần trong quá khứ đã có :) –