Есть ли отладчик шаблонов?

Шаблоны могут быть самими программами.

Есть ли отладчик шаблонов, чтобы вы могли выполнить "выполнение" шаблона?

В основном это должно быть то, что выполняется во время компиляции/ссылки/codegen, и отличается от отладки сгенерированной программы.

Даже во многих "примитивных" средах, где вы не можете использовать отладчик, вы обычно можете выполнять "отлажку printf". Возможно ли это с помощью шаблонов?

edit: Другой способ подумать об этом - это что-то вроде препроцессора C. Часто очень полезно генерировать "предварительно обработанный" исходный код - вывод из препроцессора, который компилятор фактически компилирует, - это позволяет вам увидеть, какое влияние оказывают ваши макросы. Эквивалент шаблона был бы отличным - если бы компилятор выдал исходный код без шаблона, который согласуется с шаблоном ввода. Ближайший вы можете получить, я полагаю, это переводчик С++ в C. (Не делает ли этот компилятор?)

Ответ 1

Возможно, вы захотите посмотреть этот патч для clang, который выводит экземпляры шаблонов.

Еще один простой инструмент - это сообщения об ошибках, созданные вашим компилятором для попытки создания шаблона undefined.

template< typename > struct TD;

template< typename T >
void your_template_function( T & param )
{
    // Both of these produce an error about "undefined type TD< T > with T = ..."
    TD< T > test1;
    TD< decltype( param ) > test2;
}

Это объясняется в Scott Meyers CPPCon talk, сразу после слайда лемура с кольцевым хвостом.

Ответ 2

В последние годы на конференции С++ была беседа с этой темой. Некоторые сведения вы можете найти здесь:

http://gsd.web.elte.hu/contents/articles/gpce06.pdf

и

http://patakino.web.elte.hu/ECOOP_Templight_Poster.pdf

Я понятия не имею, насколько функциональным является этот материал, но это была очень интересная стартовая точка.

Я лично написал мне некоторые вспомогательные классы, которые могут печатать мне данные типы, такие как отладка printf для стандартного кода. Если сбой компиляции, он часто дает хорошее сообщение об ошибке при вызове DebugPrinter, и если программа компилируется, но результат действительно глуп, потому что расширение типа не то, что я ожидаю, что DebugPrinter мне очень помогает!

    template< typename T>
int DebugPrintArgs( T arg )
{
    std::cout << arg  << ", ";
    return 0;
}

template <typename Head, typename ... T>
class DebugPrinter: public DebugPrinter<T...>
{
    public:
        DebugPrinter()
        {
            std::cout << "--------------------------" << std::endl;
            std::cout << __PRETTY_FUNCTION__ << std::endl;
            std::cout << "--------------------------" << std::endl;
        }

        template< typename ...Y>
            DebugPrinter( Y ... rest )
            {
                std::cout << "Construction of: " << __PRETTY_FUNCTION__ << " Values: " ;
                ExpandWithConstructor{DebugPrintArgs( rest)...};
                std::cout << std::endl;
            }

};


template <typename Head>
class DebugPrinter< Head >
{
    public:
        DebugPrinter()
        {
            std::cout << "--------------------------" << std::endl;
            std::cout << __PRETTY_FUNCTION__ << std::endl;
            std::cout << "--------------------------" << std::endl;
        }
};