前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++模版笔记(4)

c++模版笔记(4)

作者头像
一只小虾米
发布2022-11-12 14:15:11
1980
发布2022-11-12 14:15:11
举报
文章被收录于专栏:Android点滴分享

本篇介绍

本篇继续模版的学习

template 关键字

在定义模版的时候需要用到template 关键字,那还有其他用处么?有的,对于c++ 编译器,如何区分 '<' 和'>'是 模版的类型还是比较符号呢?对于c++,如果没有template名字,那么就认为是比较符号,有template,就认为是 模版类型。见下面的例子:

代码语言:javascript
复制
template<typename T>
   class Shell {
     public:
       template<int N>
       class In {
         public:
           template<int M>
           class Deep {
}; };
public:
    virtual void f();
};
template<typename T, int N>
class Weird {
  public:
    void case1 (
typename Shell<T>::template In<N>::template Deep<N>* p) { p->template Deep<N>::f(); // inhibit virtual call
}

void case2 (
        typename Shell<T>::template In<N>::template Deep<N>& p) {
p.template Deep<N>::f(); // inhibit virtual call }
};

对于p->template Deep<N>::f();,如果没有template,那编译器就会认为是 p-> ((Deep<N) > ::f() )

顺便提一下 typename,如果要强调某个名字就是类型,那就需要使用typename关键字。

ADL,POI

ADL(argument dependent lookup):C++ 按照依赖的名字查询符号机制,可以通过名字的依赖找到并不在查询范围内的符号。 POI(point of instantiation): C++按照模版替换参数生成代码的位置

模版实现的方法

Greedy Instantiation

编译器遇到POI就去实例化,让链接器去重。

Queried Instantiation

将实例化信息记录到一个数据库里,编译器在编译的时候查询数据库,已经实例化了就不去生成了

Iterated Instantiation

编译的时候不负责实例化,在链接的时候去迭代地实例化

目前编译器基本都是按照Greedy Instantiation 实现的。

避免多次实例化模版

可以讲模版声明和模版定义拆开,如下所示:

代码语言:javascript
复制
//     translation unit 1:
template<typename T> void f(); // no definition: prevents instantiation
void g() {
f<int>(); }
//     translation unit 2: template<typename T> void f() {
// implementation
}
template void f<int>();
void g();
int main() {
g(); }
// manual instantiation

这种做法虽然的确可以避免多次实例化,不过在实际中不推荐,因为需要显式实例化各种case,对于大的工程,维护成本太高。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇介绍
  • template 关键字
  • ADL,POI
  • 模版实现的方法
    • Greedy Instantiation
      • Queried Instantiation
        • Iterated Instantiation
        • 避免多次实例化模版
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档