使用静态方法的模板专用类占用存储吗?

时间:2018-05-14 13:39:30

标签: c++ templates template-specialization misra explicit-specialization

(我很抱歉这个杂乱的标题。我很乐意接受改进它的建议。)

我会尽量做到尽可能简单。我有以下代码:

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()生成代码?
  3. 基本原理:我被要求遵循MISRA C ++:2003标准中的一些指导原则。虽然已经过时,但我还是被鼓励使用那些合理的东西。特别是,有一条规则如下:

      

    头文件应该用于声明对象,函数,内联函数,函数模板,typedef,宏,类和类模板,并且不得包含或生成占用的对象或函数(或函数或对象的片段)的定义存储

         

    头文件被认为是通过#include指令包含的任何文件,无论名称或后缀如何。

    我的代码非常模板化,因此我可以根据此规则包含任何文件。我的问题来自于我完全专业化(我只做了两个:file2.hpp和file3.hpp中列出的那些)。什么完整的模板专业化?是否为它们生成了代码,即使它们没有被使用?最终,他们是否占据存储空间?

1 个答案:

答案 0 :(得分:1)

要回答您的第一个问题,我引用cppreference.com中的以下内容:

  

类模板本身不是类型,对象或任何其他类型   实体。不包含仅包含的源文件的代码   模板定义。为了显示任何代码,模板必须   实例化:必须提供模板参数以便   编译器可以从函数生成实际的类(或函数)   模板)。

包含file3.hpp不会导致代码生成。

关于第二部分,再次来自同一页,

  

当代码在上下文中引用完全需要的模板时   定义类型,或者当类型的完整性影响代码时,   并且此特定类型尚未明确实例化,   发生隐式实例化。例如,当一个对象   构造类型,但不是指向此类型的指针   构造

     

这适用于类模板的成员:除非成员是   在程序中使用,它没有实例化,也没有   需要一个定义。

除非您正在对类模板进行显式实例化,否则类模板的各个成员函数将无法实例化,,编译器将不会为MatOps<float>::method3()生成代码。< / p>