模板

模板参数类型

1、类型参数

2、非类型参数

---------------------------------------------------------------------------------------------------------------------------------

编译器如何知道函数参数的类型?

编译器优先走用户指定,用户不指定走推断

注意:模板作为模板参数的时候,Body拿不到作为参数的模板的参数

 ---------------------------------------------------------------------------------------------------------------------------------

模板函数和非模板函数同时存在,那么编译器会选择走模板函数还是非模板函数?

 ---------------------------------------------------------------------------------------------------------------------------------

如果我想 对某些类型参数执行代码A,对其他类型参数执行代码B,该怎样做?

分为函数模板和类模板:

1、函数模板不支持部分特化;

走函数模板特化解决:https://docs.microsoft.com/en-us/cpp/cpp/explicit-specialization-of-function-templates?view=msvc-160

2、类模板支持完整特化和部分特化

 ---------------------------------------------------------------------------------------------------------------------------------

类模板的成员函数在类外如何定义?

类模板的成员函数也带有自己的模板参数(成员模板),该如何定义?

类模板的成员是个类且带有自己的模板参数(成员模板),该如何定义?

---------------------------------------------------------------------------------------------------------------------------------

编译器在什么情况下会执行模板的实例化?

1、根据被调用,执行用户指定的显式实例化

2、根据被调用,执行隐式(自动)实例化

3、未被调用,不做实例化

4、声明为extern,当前模块不做实例化

 

编译器在什么情况下会把模板定义写入.obj?

实例化,编译器就会把模板定义写入.obj

 

如何防止编译器在多个.obj写入同个模板的定义?

通过extern,只要有任意一份.obj中有模板实例化定义即可,链接器只需找到一份即可。允许链接器找到多个,但不必要

此法亦可阻止隐式实例化

---------------------------------------------------------------------------------------------------------------------------------

模板的多个特化都与被调用时的参数类型匹配,编译器会选择走哪个特化?

类的部分特化有哪两种情况?

 

如果名字同时匹配到多个声明,编译器优先按照哪个声明去解析?

如果函数名字同时匹配到类非模板成员函数和类模板成员函数,那么优先匹配类的模板成员函数
如果类模板成员的实现中使用到的函数名字同时匹配到外部函数和类的成员函数,优先匹配类的成员函数
如果类模板成员的实现中使用到的名字同时匹配到基类名和模板参数名,那么优先匹配基类名

 

如果函数参数同时匹配到模板函数和非模板函数,那么编译器走哪个函数?

1、参数精准匹配优先走非模板函数

2、参数需要转换才匹配优先走模板函数

 

---------------------------------------------------------------------------------------------------------------------------------

含有模板的代码有哪两种组织方式?

1、The inclusion model

2、The explicit instantiation model

 

posted @ 2020-11-08 22:17  SwiftChocolate  阅读(59)  评论(0编辑  收藏  举报