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

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

РЕДАКТИРОВАТЬ 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 )

РЕДАКТИРОВАТЬ: В настоящее время для классов я создаю их экземпляр в .cpp файл вручную, например, так:

template TClass<int>;

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

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

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

Ответы [ 3 ]

2 голосов
/ 20 января 2012

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

1 голос
/ 20 января 2012

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

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!
}

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

0 голосов
/ 20 января 2012

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

...