Занят ли хранилище специализированный класс со статическими методами? - PullRequest
0 голосов
/ 14 мая 2018

(извините за грязный заголовок. Я с удовольствием приму предложения по его улучшению.)

Я постараюсь быть максимально простым.У меня есть следующий код:

file1.hpp

template <class val_t>
struct MatOps;

file2.hpp:

#include "file1.hpp"
template <> struct MatOps<float>{
  static void method1(){
    // Do something
  }
  static void method2(){
    // Do something
  }
  static void method3(){
    // Do something
  }
}

File3.hpp:

#include "file1.hpp"
template <> struct MatOps<double>{
  static void method1(){
    // Do something different
  }
  static void method2(){
    // Do something different
  }
  static void method3(){
    // Do something different
  }
}

main.cpp

#include "file2.hpp"
#include "file3.hpp"

int main(){
  float a,b,c,d;

  MatOps<float>::method1(a,b,...);
  MatOps<float>::method2(c,d,...);

  return 0;
}

Вопросы:

  1. Я не , используя явную специализацию MatOps<double>.Тем не менее, MatOps<double> на самом деле создается?Или более грубо: занимает ли файл file3.hpp какое-либо хранилище?
  2. Я , а не , использующий MatOps<float>::method3(), но я использую другие методы в классе.Поскольку я явно использую MatOps<float>, генерирует ли компилятор код для MatOps<float>::method3()?

Обоснование: Меня попросили следовать некоторым рекомендациям в MISRA C ++: 2003стандарт.Несмотря на то, что я устарел, мне предложили использовать все, что там разумно.В частности, существует правило, которое гласит:

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

Заголовочный файл - это любой файл, включаемый с помощью директивы #include, независимо от имени или суффикса.

Мой код сильно шаблонизирован, и поэтому я могу включать любые файлы в соответствии с этим правилом.Моя проблема возникает, когда я делаю полную специализацию (я делаю только две из них: те, которые перечислены в file2.hpp и file3.hpp).Какие являются полными шаблонными специализациями?Генерируется ли для них код, даже если они не используются?В конечном счете, они занимают хранилище?

1 Ответ

0 голосов
/ 14 мая 2018

Чтобы ответить на ваш первый вопрос, я цитирую следующее: cppreference.com :

Шаблон класса сам по себе не является ни типом, ни объектом, ни каким-либо другим юридическое лицо. Код не генерируется из исходного файла, который содержит только определения шаблонов. Для того, чтобы появился любой код, шаблон должен быть созданным: аргументы шаблона должны быть предоставлены так, чтобы Компилятор может генерировать реальный класс (или функцию, из функции шаблон).

Включение file3.hpp не приведет к генерации кода само по себе.

Что касается второй части, снова с той же страницы,

Когда код ссылается на шаблон в контексте, который требует полностью определенный тип, или когда полнота типа влияет на код, и этот конкретный тип не был явно создан, происходит неявная реализация. Например, когда объект этого Тип создается, но не тогда, когда указатель на этот тип построен.

Это относится к членам шаблона класса: если член не используется в программе, он не создан и не требует определения.

Если вы не выполняете явную реализацию вашего шаблона класса, отдельные функции-члены вашего шаблона класса не будут созданы, т.е. , компилятор не будет генерировать код для MatOps<float>::method3().

...