Trong my previous question Tôi muốn sử dụng static_assert để hạn chế tham số mẫu là một loại phụ cụ thể. Câu hỏi đã được trả lời, mã để lưu trữ như sau:C++ 11 static_assert: Thông báo lỗi tham số
template <typename T>
struct X {
static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};
Bây giờ, tôi muốn làm cho thông báo lỗi súc tích hơn. Tức là, tôi muốn nêu rõ loại nào vi phạm ràng buộc này. Ví dụ: nếu lớp A
không được bắt nguồn từ Y
và ai đó instanciates X<A>
, thì thông báo lỗi sẽ in "Thông số loại phải được bắt nguồn từ Y, nhưng A không phải là".
Điều này có thể đạt được bằng thư viện chuẩn không?
tôi thấy hai thách thức:
- chuỗi Lắp ráp tại compiletime mà không sử dụng tăng :: mpl
- lấy tên của các loại mà T được instanciated. Tên nên có ý nghĩa, lý tưởng giống như tên được sử dụng trong định nghĩa vi phạm. Tôi đã thử typeid (T) .name() nhưng nó chỉ trả về tên bị xáo trộn mà không được chấp nhận. Tôi nhớ rằng có một loại macro nào đó trả về tên của một thứ gì đó, nhưng tôi không thể nhớ lại điều đó nữa.
liên quan (peraps thậm chí lừa): http://stackoverflow.com/q/6415186/34509 –