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