2013-04-22 39 views
5

Tôi cần (muốn) chuyên một phương thức bên trong một lớp mẫu, để chỉ cho phép một số kiểu nguyên thủy nhất định. (Đây không phải là một câu hỏi trùng lặp của this)chuyên môn về phương pháp mẫu bên trong lớp mẫu

Vâng tôi đã có lớp học này:

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    X& get(const arg_type var); 
} 

Tôi muốn chuyên arg_type để cho phép số nguyên chỉ unsigned, một cái gì đó như thế này:

template<typename TYPE, size_t NB> template<unsigned long> X& X::get(const unsigned long val); 

Nhưng chắc chắn, những điều trên không hoạt động, không phải trên msvc2011 cũng như trên gcc

Cụ thể hơn, những gì tôi cố gắng làm là viết mã dựa trên khuôn mẫu gõ ở trên, và viết chuyên môn để bất cứ ai sử dụng lớp X này không thể sử dụng phương pháp này với một cái gì đó khác hơn những gì tôi chuyên ngành.

Điều đó có thể thực hiện được không? và nếu nó là, nó là xấu để làm điều đó như vậy?

Cảm ơn trước, jav974

+1

Tại sao bạn nghĩ rằng có mẫu lồng nhau là cách tiếp cận tốt nhất? Trong khi bạn có thể thực hiện công việc này, có thể có các giải pháp đơn giản hơn, chẳng hạn như không có mẫu lồng nhau và không quá tải mẫu ... –

Trả lời

4

Một chuyên môn hóa không phải là những gì bạn muốn. Sử dụng một chuyên môn, bạn có thể cung cấp một cách đặc biệt để xử lý sự khởi tạo của phương thức mẫu của bạn bằng cách sử dụng một loại tích phân không dấu, nhưng không có gì ngăn cản người dùng khởi tạo nó bằng một kiểu khác.

Bạn có thể đạt được điều này sử dụng một số SFINAE:

#include <type_traits>  

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    typename std::enable_if<std::is_unsigned<arg_type>::value, X&>::type // arg_type is unsigned 
    get(arg_type val) 
    { 

    } 
}; 

Bạn cũng có thể sử dụng static_assert, để người dùng có được một thông báo lỗi thân thiện hơn:

template<typename arg_type> 
X& get(arg_type val) 
{ 
    static_assert(std::is_unsigned<arg_type>::value, "The argument should be unsigned!"); 
} 

Nếu bạn muốn TYPE mẫu tham số để tuân theo các quy tắc tương tự, bạn cũng có thể sử dụng static_assert:

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    static_assert(std::is_unsigned<TYPE>::value, "TYPE should be unsigned!"); 
}; 
+0

Tuyệt vời !! tôi không biết về điều đó, cảm ơn bạn rất nhiều !! Bằng cách 'TYPE' cho lớp học cũng nên tuân thủ các quy tắc tương tự, tôi nên đặt kiểm tra này ở đâu? ctor? – jav974

+0

@ jav974 xem chỉnh sửa của tôi. – mfontanini

+0

Cảm ơn nó đá, tôi đánh dấu nó giải quyết! – jav974

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