美文网首页
c++模版笔记(4)

c++模版笔记(4)

作者: android小奉先 | 来源:发表于2022-10-29 21:57 被阅读0次

本篇介绍

本篇继续模版的学习

template 关键字

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

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 实现的。

避免多次实例化模版

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

//     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,对于大的工程,维护成本太高。

相关文章

  • c++模版笔记(4)

    本篇介绍 本篇继续模版的学习 template 关键字 在定义模版的时候需要用到template 关键字,那还有其...

  • c++语法系列之7-- 函数模板

    (C++ Templates笔记) 1 函数模版的定义 说明:1)typename后面的T为模板参数,max后面的...

  • 《深入探索C++对象模型》笔记 Chapter4

    《深入探索C++对象模型》笔记 Chapter2《深入探索C++对象模型》笔记 Chapter3 第4章 函数 4...

  • C++模版笔记(1)

    本篇介绍 本篇摘录自<>,记录其中部分内容。 Variadic Templates ...

  • C++模版笔记(2)

    本篇介绍 本篇继续C++的模版介绍 std::enable_if<> enable_if<> 的作用是满足条件后可...

  • c++模版笔记(3)

    本篇介绍 本篇继续C++的模版介绍 std::invoke 以一种统一形式调用函数和传递参数: 如果需要返回值, ...

  • 日记之旅第三天

    上午:1.学习C++中函数4中特性,函数返回值,函数形参,函数模版,其中模版最为难以理解,值得自己后面好好研究下下...

  • 读书笔记17.06.03

    C++ STL:Listlist是C++标准模版库(STL,Standard Template Library)中...

  • macOS 下 C++ 模版的反汇编

    C++ 模版代码 先来一段简单的 C++ 模版的代码,代码如下: 代码的功能很简单的,分别传入 int 和 lon...

  • Effective c++ 学习笔记(item4)

    Effective c++ 学习笔记(item4) item4: make sure that objects a...

网友评论

      本文标题:c++模版笔记(4)

      本文链接:https://www.haomeiwen.com/subject/orxvartx.html