2013-01-12 28 views
20

Làm cách nào để viết mẫu lớp chỉ chấp nhận các loại số (int, double, float, v.v ...) làm mẫu?Mẫu lớp cho các loại số

+0

@KonradRudolph Đỗ bạn cũng muốn sửa tiêu đề? Tôi đang nhầm lẫn nếu OP thực sự có nghĩa là các loại hoặc thực sự có nghĩa là hằng số của các loại. – pmr

+0

@pmr Tôi không (nhưng bây giờ tôi đã làm), bắt tốt. Tôi khá chắc chắn rằng OP có nghĩa là các loại, nếu không có lý do nào khác mà bạn không thể sử dụng các loại không tách rời làm mẫu không phải loại và câu hỏi đó không có ý nghĩa gì khi bắt đầu nói về các mẫu không phải loại. –

+0

@KonradRudolph Vâng, ý tôi là các loại. – djWann

Trả lời

26

Bạn có thể sử dụng đặc tính loại std::is_arithmetic. Nếu bạn muốn chỉ cho phép instantiation của một lớp học với một kiểu như vậy, sử dụng nó kết hợp với std::enable_if:

#include <type_traits> 

template< 
    typename T, //real type 
    typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type 
> struct S{}; 

int main() { 
    S<int> s; //compiles 
    S<char*> s; //doesn't compile 
} 

Đối với một phiên bản của enable_if đó là dễ dàng hơn để sử dụng, và một bổ sung miễn disable_if, tôi khuyên bạn nên đọc this wonderful article (hoặc cached version) về vấn đề này.

+2

Bạn có thể bỏ qua 'typename Dummy ='. Hơn nữa tôi khuyên bạn nên sử dụng [Wheels] (https://bitbucket.org/martinhofernandes/wheels) ở đây, nó làm cho mã đơn giản hơn rất nhiều: 'template >>' –

+0

@ KonradRudolph, bạn nói đúng, cảm ơn. Và tôi sẽ thêm một liên kết vào bài viết 'enable_if' của anh ấy để đọc thêm. – chris

+0

@KonradRudolph, Loại bỏ các 'giả 'là những gì làm cho nó không biên dịch, nhưng tôi không quá kinh nghiệm với nó, vì vậy tôi không thể nói làm thế nào nó được cho là, khác hơn thế. Tôi nhận ra rằng tôi có thể loại bỏ tên vô nghĩa, mặc dù. – chris

3

tôi thấy các thông báo lỗi nhận được từ phương pháp template<typename T, typename = ...> cao khó hiểu (VS 2015), nhưng phát hiện ra rằng một static_assert với các loại đặc điểm tương tự cũng hoạt động và cho phép tôi chỉ định một thông báo lỗi:

#include <type_traits> 

template <typename NumericType> 
struct S 
{ 
    static_assert(std::is_arithmetic<NumericType>::value, "NumericType must be numeric"); 
}; 

template <typename NumericType> 
NumericType add_one(NumericType n) 
{ 
    static_assert(std::is_arithmetic<NumericType>::value, "NumericType must be numeric"); 
    return n + 1; 
} 

int main() 
{ 
    S<int> i; 
    S<char*> s; //doesn't compile 

    add_one(1.f); 
    add_one("hi there"); //doesn't compile 
} 
+0

Chắc chắn. Sẽ tốt hơn nếu bạn thêm thông điệp này vào đây. – kyb

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