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ố
Trả lời
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.
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
@ 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
@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
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
}
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
- 1. Quá tải các lớp mẫu theo số tham số mẫu
- 2. Các mẫu và mẫu lớp đẹp cùng với tất cả các đối số mẫu của nó
- 3. C++ Mẫu "loại lớp" Lỗi
- 4. nhiều tham số loại trong các loại lớp haskell
- 5. Loại bỏ g ++ cảnh báo cho mẫu tham số
- 6. Loại đầu vào cho biểu mẫu HTML cho số nguyên
- 7. Mẫu phương thức mẫu cho các lớp tĩnh
- 8. Chuyên môn về mẫu cho các lớp con của lớp cơ sở mẫu
- 9. Lớp C++ Mẫu với các thành viên tĩnh - Tương tự cho tất cả các loại của lớp
- 10. trả về các loại mẫu từ các phương thức không tham số mẫu
- 11. Cách thiết kế các lớp mẫu lồng nhau trong đó các lớp lồng nhau cùng loại
- 12. Sử dụng mẫu đối số mẫu lớp như tham số
- 13. Tham số mẫu chức năng giảm từ các loại đối số mẫu
- 14. Lớp 'không phải là loại mẫu'
- 15. Tính năng nào của C++ cho phép các lớp mẫu tự giới thiệu mà không có đối số mẫu?
- 16. Cách kiểm tra loại thông số mẫu?
- 17. Một mẫu chuyên môn cho nhiều lớp
- 18. Các loại số lớn
- 19. Tại sao không thể nhập các thông số loại không thuộc loại lớp
- 20. Tóm tắt các loại/Loại Các tham số trong Scala
- 21. Có các mẫu cho mô hình/lớp thực thể
- 22. Loại trừu tượng Scala đại diện cho loại phân lớp
- 23. Làm cách nào để tạo một lớp chung cho tất cả các loại số?
- 24. C++ Mẫu cho các số nguyên an toàn
- 25. Khớp mẫu trên loại [_] loại?
- 26. C++ 11 is_same loại đặc điểm cho các mẫu
- 27. Quy ước đặt tên cho các loại mẫu?
- 28. Mẫu lớp C++ là mẫu: đối số mẫu không hợp lệ
- 29. Typedef một lớp mẫu mà không cần chỉ định các tham số mẫu
- 30. Ngoài các định nghĩa mẫu khai báo cho phương thức mẫu trong lớp mẫu
@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
@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. –
@KonradRudolph Vâng, ý tôi là các loại. – djWann