Khi thực hiện lập trình meta bằng cách sử dụng mẫu C++, có phương pháp nào có thể được sử dụng, sắp xếp giống như trình gỡ rối, để hướng dẫn cách các mẫu được khởi tạo và tuân thủ không? Có vẻ như ngay bây giờ, khi tạo một mạng lưới các mẫu phức tạp, thực sự không phải là một cách hay để gỡ lỗi chúng ngoài việc xem các thông báo lỗi của trình soạn thảo để xem các mẫu đang được khởi tạo như thế nào (nếu có bất kỳ lỗi trình biên dịch nào), và nỗ lực làm việc ngược từ các thông báo lỗi nếu có điều gì đó không mong muốn được tạo ra. Tôi không thực sự chắc chắn nếu những gì tôi đang tìm kiếm thậm chí tồn tại, vì nó sẽ có được một cái gì đó được thực hiện tại thời gian biên dịch, nhưng về cơ bản nó sẽ là một phương pháp, loại giống như bước qua mã và kiểm tra khung stack trong gdb
khi chạy, nơi trình biên dịch có thể được dừng lại và môi trường được kiểm tra cho chuỗi theo đó một mẫu hoặc tập hợp các mẫu lồng nhau đang được khởi tạo.Gỡ lỗi mẫu ngay lập tức
Ví dụ, giả sử tôi tạo ra một số mã đơn giản như sau:
template<typename T, typename R = void>
struct int_return_type {};
template<typename R>
struct int_return_type<int, R>
{
typedef R type;
};
template<typename T, typename R = void>
struct float_return_type {};
template<typename R>
struct float_return_type<float, R>
{
typedef R type;
};
template<typename T>
typename int_return_type<T>::type test()
{
cout << "T type is int" << endl;
}
template<typename T>
typename float_return_type<T>::type test()
{
cout << "T type is float" << endl;
}
int main()
{
test<int>();
test<float>();
return 0;
}
Tôi biết điều này là mã tương đối dễ dàng để làm theo, nhưng các mẫu có thể tham gia khá hơn một chút, đặc biệt là khi làm lập trình meta, đệ quy, vv Tôi hiểu rằng trình biên dịch sẽ phát hành các thông báo lỗi có thể được sử dụng để suy ra cách các mẫu được khởi tạo, nhưng tôi cũng tự hỏi điều gì có thể được thực hiện khi mã mẫu thực tế đúng theo nghĩa cú pháp, nhưng thời gian chạy kết quả vẫn không chính xác. Nó sẽ là tốt đẹp ví dụ để có một phương pháp để ngăn chặn trình biên dịch và xem những gì test
, cũng như int_return_type
và float_return_type
, đã được instantiated với, hoặc những gì instantiations đã thất bại.
Hiện tại chỉ có các tùy chọn có sẵn để gỡ lỗi các mẫu với mức độ chi tiết 1) thông báo lỗi trình biên dịch khi mã không chính xác và 2) kết hợp các trình gỡ rối và trình gỡ lỗi để xem mã được tạo ra gì khi chạy kết quả thời gian không chính xác? Hoặc là có một số tiện ích khác ra có giúp với "xem" làm thế nào các mẫu được instantiated, và xem/kiểm tra những gì mã được tạo ra bởi trình biên dịch để điều tra và gỡ lỗi lỗi mẫu?
khác với 'static_assert' để làm những điều bạn muốn xem lỗi Tôi không nghĩ có bất cứ điều gì để giúp – Flexo