2012-06-15 39 views
8

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.
+1

liên quan (peraps thậm chí lừa): http://stackoverflow.com/q/6415186/34509 –

Trả lời

7

Bạn không thể thực hiện việc này. static_assert muốn một chuỗi chữ. Bạn không có cách nào để tập hợp danh tính ngữ nghĩa của TY vào chuỗi ký tự.

Bạn có thể hy vọng rằng trình biên dịch cho phép dễ dàng đọc ngược lại của ngăn xếp mẫu instantiation và cung cấp cho bạn giá trị của các tham số mẫu TY mẫu của phiên bản mẫu lớp kèm theo.

Những người khác cũng nghĩ về điều này, xem http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073 chẳng hạn.

+0

Như mọi khi để chẩn đoán, đó là một QOI. –

+0

thật đáng tiếc. Tại sao một chuỗi, một chuỗi liên tục thời gian biên dịch sẽ tốt hơn: (. – gexicide

+0

@gexicide Nó thường không thực tế để tạo thành các chuỗi liên tục biên dịch, dù sao đi nữa. (Bên cạnh các chữ, tất nhiên.) In các giá trị của một chuỗi các biên dịch tùy ý- Tuy nhiên, các giá trị hằng số thời gian và/hoặc loại-id sẽ là tốt đẹp, tuy nhiên, – Potatoswatter

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