nói chung không thể xuất toàn bộ mã. Nhưng những gì tôi thấy cực kỳ thú vị, là khả năng sử dụng trình gỡ lỗi Visual C++ để hiển thị cho bạn loại. Sử dụng chương trình meta đơn giản đó:
template<class Head, class Tail>
struct type_list
{
typedef Head head;
typedef Tail tail;
};
struct null_type
{};
template<class List>
struct list_head
{
typedef typename List::head head;
};
template<class List>
struct list_tail
{
typedef typename List::tail tail;
};
template<class List>
struct list_length
{
static const size_t length = 1+list_length< typename list_tail<List>::tail >::length;
};
template<>
struct list_length<null_type>
{
static const size_t length = 0;
};
int main()
{
typedef
type_list
< int
, type_list
< double
, type_list
< char
, null_type
>
>
> my_types;
my_types test1;
size_t length=list_length<my_types>::length;
list_head<list_tail<list_tail<my_types>::tail>::tail>::head test2;
}
Tôi vừa khởi tạo các loại meta của mình. Đây vẫn là các cá thể lớp C++ rỗng, dài ít nhất 1 byte. Bây giờ tôi có thể đặt một breakpoint sau khi instantiation cuối cùng của test2 xem, mà loại/giá trị chiều dài, test1 và test2 là của:
Dưới đây là những gì các chương trình gỡ rối cho thấy:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Bây giờ bạn bạn biết đầu trả về cho bạn một ký tự, danh sách của bạn chứa int, double, char và được kết thúc bằng null_type.
Điều đó đã giúp tôi rất nhiều. Đôi khi bạn cần phải sao chép các loại thực sự lộn xộn đến một trình soạn thảo văn bản và định dạng nó thành một dạng có thể đọc được, nhưng điều đó mang đến cho bạn khả năng để theo dõi những gì bên trong và cách nó được tính toán.
Hy vọng rằng sẽ giúp,
Ovanes
Không, nhưng nó phải là. Ai đó nên làm điều này như một dự án Clang: D –
Lưu ý rằng do [SFINAE] (https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error) mã bạn muốn có được bằng cách thay thế từng mẫu bằng một số thay thế được mã hóa cứng có thể sẽ là bất hợp pháp. Ví dụ. miễn là nó không bao giờ được gọi, một phương thức của một lớp mẫu cũng có thể gọi những thứ không tồn tại. – MvG
@JosephGarvin Có một dự án dựa trên Clang (s) cho việc này ngay bây giờ. Phiên bản hoạt động mới nhất của [Templight, trình chỉnh sửa và trình gỡ lỗi mẫu dựa trên clang-based] (https://github.com/mikael-s-persson/templight), [Trình hiển thị Templar] (https://github.com/ schulmar/Templar), cũng như [Metashell] (https://github.com/sabel83/metashell). –