2017-07-21 17 views
7

Có cách nào để tạo chuyên môn mẫu cho các loại cơ bản không? Tôi đã cố thực hiện những việc sau:Chuyên môn về mẫu cho các loại cơ bản

template<typename T, typename = typename std::enable_if<!std::is_fundamental<T>::value>::type> 
class foo 
{ 
} 

template<typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type> 
class foo 
{ 
} 

Nhưng tôi gặp lỗi khi mẫu đã được xác định.

+0

có thể trùng lặp của [SFINAE làm việc trong kiểu trả về nhưng không phải là mẫu tham số] (https://stackoverflow.com/questions/15427667/ sfinae-working-in-return-type-nhưng-không-như-mẫu-tham số) –

+0

@EdgarRokyan Không phải là một sự lừa đảo; rằng một trong những là đối phó với các chức năng, điều này với các lớp học – Justin

+0

@Justin nhưng nguyên tắc phải giống nhau, phải không? –

Trả lời

15

Ở đây bạn đang tạo hai lớp được tạo khuôn mẫu có cùng tên chứ không phải là chuyên môn.

Bạn cần phải tạo một generic và sau đó chuyên nó:

// not specialized template (for non-fundamental types), Enabler will 
// be used to specialize for fundamental types 
template <class T, class Enabler = void> 
class foo { }; 

// specialization for fundamental types 
template <class T> 
class foo<T, std::enable_if_t<std::is_fundamental<T>::value>> { }; 
+0

cảm ơn bạn rất nhiều :) –

+4

Bạn có * thực sự * cần chuyên về '! Is_fundamental'? Bạn chỉ có thể sử dụng mẫu chính. – Rakete1111

+0

Tôi đang sử dụng mẫu chính cho shared_ptrs, tôi đang tạo mẫu để lưu trữ các giá trị lockfree. –

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