(извините за грязный заголовок. Я с удовольствием приму предложения по его улучшению.)
Я постараюсь быть максимально простым.У меня есть следующий код:
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;
}
Вопросы:
- Я не , используя явную специализацию
MatOps<double>
.Тем не менее, MatOps<double>
на самом деле создается?Или более грубо: занимает ли файл file3.hpp какое-либо хранилище? - Я , а не , использующий
MatOps<float>::method3()
, но я использую другие методы в классе.Поскольку я явно использую MatOps<float>
, генерирует ли компилятор код для MatOps<float>::method3()
?
Обоснование: Меня попросили следовать некоторым рекомендациям в MISRA C ++: 2003стандарт.Несмотря на то, что я устарел, мне предложили использовать все, что там разумно.В частности, существует правило, которое гласит:
Заголовочные файлы должны использоваться для объявления объектов, функций, встроенных функций, шаблонов функций, typedef, макросов, классов и шаблонов классов и не должны содержать илисоздавать определения объектов или функций (или фрагментов функций или объектов), которые занимают хранилище.
Заголовочный файл - это любой файл, включаемый с помощью директивы #include
, независимо от имени или суффикса.
Мой код сильно шаблонизирован, и поэтому я могу включать любые файлы в соответствии с этим правилом.Моя проблема возникает, когда я делаю полную специализацию (я делаю только две из них: те, которые перечислены в file2.hpp и file3.hpp).Какие являются полными шаблонными специализациями?Генерируется ли для них код, даже если они не используются?В конечном счете, они занимают хранилище?