Могу ли я проверить, какие шаблоны функций были или не были созданы хотя бы один раз?

У меня много шаблонного кода. Поскольку плохой код шаблона не выдает ошибку компилятора, если он не скомпилирован, есть ли способ проверить, какие функции шаблона компилятор фактически «скомпилировал», а какие вообще были проигнорированы?

РЕДАКТИРОВАТЬ 2:

Если конкретный шаблон класса или шаблон функции создается один раз для любых типов параметров, это нормально. Мне нужен список шаблонов функций/классов, которые никогда не создавались ни в какой форме.

Одним из конкретных примеров является следующий. Это две разные функции шаблона, и я хотел бы знать, не создается ли ни одна из них или обе.

template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag )

template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, random_access_iterator_tag )

EDIT: В настоящее время для классов я создаю экземпляры в файле .cpp вручную следующим образом:

template TClass<int>;

для всех типов, которые меня интересуют. Это хорошо. Но это если я не забуду это сделать. Иногда мне нужно написать множество небольших шаблонных классов/функций, где я забываю создать экземпляр некоторых из шаблонов функций/классов вручную и выясняю это позже. Я хотел бы, чтобы компилятор сказал мне это.

В качестве альтернативы, если бы я мог получить список шаблонов функций/классов, которые были созданы (для любого параметра), я мог бы сравнить его с полным списком, который я мог бы найти в коде.

Еще одним преимуществом будет "проверка", какие методы были скомпилированы в классе шаблона, который использует признаки типа для выборочной компиляции определенных функций. Прежде чем двигаться дальше, я хочу убедиться, что моя логика выбора правильных функций верна.


person Samaursa    schedule 20.01.2012    source источник
comment
И что бы вы сделали, если бы могли это проверить?   -  person Jon    schedule 20.01.2012
comment
@Jon: я бы проверил его, вручную создав экземпляр с фиктивными типами, чтобы убедиться, что его синтаксис верен, по крайней мере, для типов, которые, как я знаю, он может принимать.   -  person Samaursa    schedule 20.01.2012
comment
Итак, вот ваш ответ: создайте тестовый проект, в котором вы вызываете все шаблонные функции с всеми типами, которые, как вы знаете, они могут принимать. Если проект не компилируется, у вас проблема. :)   -  person Jon    schedule 20.01.2012
comment
Вы хотите заставить его скомпилировать все шаблоны для интересующих вас типов? Или вместо этого вы хотите просто узнать, какие из них были скомпилированы? Я полагаю, вы действительно хотите первого. Если последнее является решением, то какую проблему оно должно решить!?   -  person Aaron McDaid    schedule 20.01.2012
comment
@Jon: Ха-ха, ну, именно поэтому я и спрашиваю об этом. Как люди, мы склонны что-то упускать. Когда вы в последний раз считали, сколько классов у вас есть в вашей программе :P Однако компилятор знает. Я надеялся, что это поможет мне и в этом случае.   -  person Samaursa    schedule 20.01.2012
comment
Заставьте ваш компилятор генерировать ассемблерный код из вашего кода C++ и изучите его.   -  person Alexey Frunze    schedule 20.01.2012
comment
@Alex: Надеюсь, это шутка :P   -  person Samaursa    schedule 20.01.2012
comment
@Samaursa, можешь сделать шаг назад и рассказать нам, что ты действительно хочешь здесь делать? Если бы вы могли получить этот список, что бы вы с ним сделали? Вы заинтересованы в том, чтобы этот список включал ваш целевой список типов? Или вам интересно убедиться, что этот список не включает типы, кроме тех, которые есть в вашем списке? Или оба? (Если да, то мы можем помочь прояснить ваш вопрос и, возможно, ответить на него вам.)   -  person Aaron McDaid    schedule 20.01.2012
comment
@ Самаурса: Почему? Однажды это помогло мне понять, что на самом деле делает какой-то сильно шаблонный код. Это было с msvc++.   -  person Alexey Frunze    schedule 20.01.2012
comment
@AaronMcDaid: Пожалуйста, смотрите правку   -  person Samaursa    schedule 20.01.2012
comment
Я все еще в замешательстве. Ваша цель — увидеть, какие шаблоны классов были созданы (хотя бы один раз)? У вас много разных шаблонов классов? И сколько типов передается каждому шаблону?   -  person Aaron McDaid    schedule 20.01.2012
comment
@AaronMcDaid: Дайте мне знать, если вы хотите присоединиться к этой комнате для обсуждения: chat.stackoverflow.com/rooms/ 6873/проверить-шаблоны   -  person Samaursa    schedule 20.01.2012
comment
Хорошая идея, @Samaursa. По крайней мере, я буду там ближайшие несколько минут.   -  person Aaron McDaid    schedule 20.01.2012


Ответы (3)


Кто-то упомянул, что «все можно решить, добавив уровень косвенности» — вы можете добавить статическое утверждение к каждой функции и наблюдать за неудачей компиляции:

template <typename T>
struct Asserter
{
  static const bool value = false;
};

template <typename T>
struct Foo
{
  void foo()
  {
    static_assert(Asserter<T>::value, "Foo::foo() is being compiled.");
  }
  void bar()
  {
    static_assert(Asserter<T>::value, "Foo::bar() is being compiled.");
  }
};

int main()
{
  Foo<int> f;
  //f.foo();  // static assertion!
}

Если вы не хотите, чтобы компиляция прерывалась на каждом этапе, вы можете вместо этого создать Boost статическое предупреждение или что-то подобное.

person Kerrek SB    schedule 20.01.2012
comment
В итоге я выбрал это решение, обернув утверждения макросами, которые ничего не делают с определенным препроцессором. - person Samaursa; 08.03.2012

Учитывая, что вы используете MSVC 2008, вы можете сделать это, создав файл карты компоновщика и выполнив поиск всех экземпляров этой функции или проверив .pdb через DIA. Вы захотите отключить сворачивание COMDAT с помощью флага компоновщика /OPT:NOICF, чтобы вы могли найти функции, которые компилируются в одну и ту же сборку.

person MSN    schedule 20.01.2012

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

person Jason    schedule 20.01.2012