При выполнении метапрограммирования с использованием шаблонов С++ существует ли метод, который можно использовать, вроде отладчика, для того, чтобы просмотреть, как создаются и выполняются шаблоны? Кажется, сейчас, создавая сложную сеть шаблонов, на самом деле не очень хороший способ отладки их, кроме поиска сообщений об ошибках complier, чтобы увидеть, как создаются шаблоны (если есть какие-либо ошибки компилятора) и попытка отступить от сообщений об ошибках, если создается что-то неожиданное. Я не совсем уверен, что то, что я ищу, даже существует, так как это должно было быть чем-то, что было сделано во время компиляции, но в основном это был бы метод, вроде как переход кода и рассмотрение фрейма стека в gdb
во время выполнения, где компилятор может быть остановлен и среда проверена для последовательности, в которой создается экземпляр шаблона или набора вложенных шаблонов.
Например, скажем, я создал простой код, например:
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;
}
Я знаю, что это относительно простой код для последующего использования, но шаблоны могут стать немного более активными, особенно при выполнении метапрограммирования, рекурсии и т.д. Я понимаю, что complier выдаст сообщения об ошибках, которые можно использовать для вывода того, как шаблоны но я также задаюсь вопросом, что можно сделать, когда фактический шаблон кода верен в синтаксическом смысле, но результаты выполнения все еще неверны. Было бы неплохо, например, иметь способ остановить компилятор и посмотреть, что было создано test
, а также int_return_type
и float_return_type
, или какие экземпляры не выполнялись.
Доступны ли только доступные параметры для отладки шаблонов с этим уровнем детализации 1) сообщения об ошибках компилятора при неправильном коде и 2) комбинация дизассемблеров и отладчиков, чтобы увидеть, какой экземпляр был сгенерирован, неверные результаты времени? Или есть некоторые другие утилиты, которые помогают "наблюдать" за тем, как создаются шаблоны, и посмотреть/проверить, какой код генерируется компилятором для исследования и отладки ошибок шаблона?