Tôi đang cố gắng hiểu tính hữu dụng của static_assert
và tôi muốn biết liệu nó có thể giúp tôi thực thi một thiết kế hay không, và nếu có, làm thế nào.Thực thi loại mẫu thông qua static_assert
Tôi có một lớp mẫu chung ẩn tự thực hiện riêng của mình bên trong một lớp mẫu khác, một phần chuyên biệt dựa trên kích thước của loại mẫu. Dưới đây là một phác thảo ngắn gọn về thiết kế này:
template <class T, size_t S = sizeof(T)>
struct Helper;
template <class T>
struct Helper<T, sizeof(long)>
{
static T bar();
};
// ... other specializations ...
template <class T>
class Foo
{
public:
T bar()
{
return Helper<T>::bar();
}
};
Foo chỉ được hỗ trợ nếu kích thước của T
được hỗ trợ bởi một chuyên môn của Helper. Ví dụ: Foo<long>
và Foo<unsigned long>
đều được hỗ trợ. Tuy nhiên, giả sử người dùng cố gắng tạo một Foo<bool>
. Thông thường, điều này sẽ tạo ra lỗi vì chuyên môn của Helper cho bool
không được xác định, đó là hành vi dự định.
Có cách nào để sử dụng static_assert
trong thiết kế này để cung cấp thêm lỗi hữu ích cho người dùng của giao diện này không?
Ngoài ra, tôi cũng muốn hạn chế người dùng sử dụng một loại cụ thể, mặc dù kích thước có thể chính xác. Ví dụ: Foo<float>
không được phép. Ngay bây giờ, cách duy nhất tôi biết thực thi điều này là thông qua một bình luận in đậm trong tài liệu. :)
Suy nghĩ chung hơn, chỉ là các loại số nguyên được hỗ trợ? Không có 'char',' bool', 'float', et al? – Rapptz
Tìm kiếm SO cho các ràng buộc kiểu mẫu hoặc "khái niệm". Một cơ sở để làm điều này đã được gỡ bỏ từ C++ 11 ở phút cuối cùng. Tuy nhiên, có ít cách tự động hơn để đạt được kết quả tương tự. – luke
@Rapptz, 'char',' int' và 'long', cùng với các phiên bản' unsigned' của chúng sẽ được hỗ trợ. Mã sẽ giống hệt nhau cho 'int',' long' và 'unsigned long' nếu' sizeof (int) == sizeof (dài) == sizeof (unsigned long) '. – Zeenobit