文档章节

Effective C++: 防止template的膨胀.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/03/27 17:03
字数 429
阅读 38
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

假如我们用一个模板类封装一个矩阵的数据,如果矩阵的大小改变,该模板类又会再次实例化出来一个,这样显然造成了代码的膨胀。

为了防止这样让我们来看代码吧:

 #include <iostream>
#include <memory>
template<typename T>
class MatrixBase{
 private:
  std::shared_ptr<T*> square_;
  
  protected:
   template<typename Ty>
   void set_data_ptr(std::shared_ptr<Ty*> ptr_);
   
   public:
    
    MatrixBase()=default;
    
    virtual ~MatrixBase();
};
template<typename T>
template<typename Ty>
void MatrixBase<T>::set_data_ptr(std::shared_ptr<Ty*> ptr_)
{
 this->square_ = ptr_;
}
template<typename T>
template<typename Ty>
MatrixBase<T>::MatrixBase(std::shared_ptr<Ty*> ptr_)
              :square_(ptr_)
{
 //constructor.
}
template<typename T>
MatrixBase<T>::~MatrixBase()
{
 std::cout<<"in Base"<<std::endl;
 this->square_.reset();
}
template<typename T>
class SquareMatrix : private MatrixBase<T>{
 private:
  int size_;
  
  class Deleter{
   public:
    template<typename Ty>
    void operator()(Ty** ptr, const int& N)
    {
     std::cout<<"delete !"<<N<<std::endl;
     if(ptr != nullptr){
      
      for(int i=0; i<N; ++i){
       std::cout<<"start"<<i<<std::endl;
       delete[] ptr[i];
      }
      
      std::cout<<"before end! "<<std::endl;
      delete[] ptr;
      std::cout<<"end"<<std::endl;
     }
    }
  };
  
  public:
   
   SquareMatrix(const int& sz_);
   
   ~SquareMatrix()=default;
};
template<typename T>
SquareMatrix<T>::SquareMatrix(const int& sz_)
                :size_(sz_)
{
 T** temp_ptr = new T*[this->size_];
 for(int i=0; i<this->size_; ++i){
  temp_ptr[i]=new T[2];
 }
 
 auto Delete = std::bind(Deleter(), std::placeholders::_1, this->size_);
 this->set_data_ptr(std::shared_ptr<T*>(temp_ptr, Delete));//这里的this->是必须的因为在编译阶段
                     //并不知道MatrixBase的模板参数类型,因此也就无法知道MatrixBase中有什么内容
                     //我们通过this->告诉编译器有这么个函数,但是也可以通过MatrixBase::set_data_ptr.
 
 temp_ptr = nullptr;
}
int main()
{
 SquareMatrix<int> s(2);
 
 return 0;
}

 我们来看看普通(非模板类)的private继承关于this->的区别:

 #include <iostream>
class Base{
 private:
  int x=0;
  
  public:
   Base()=default;
   
   virtual ~Base()=default;
   
   protected:
    void print()const;
};
void Base::print()const
{
 std::cout<<"x: "<<x<<std::endl;
}
class Inherit : private Base{
 private:
  int y;
  
  public:
   Inherit();
   
   ~Inherit()=default;
};
Inherit::Inherit()
{
 print(); //这里可以写成this->print(),也可以不写. 
}
int main()
{
 Inherit i;
 
 return 0;
}

© 著作权归作者所有

SHIHUAMarryMe
粉丝 13
博文 162
码字总数 138435
作品 0
武汉
程序员
私信 提问
C++ 模板惯用法

原文:C++ 模板惯用法 作者:Breaker 关于 C++ 模板编程的惯用法,note-to-self + keynote + idiom case + cross-reference 式笔记 目录 模板语法 模板惯用法示例 堆栈上分配 编译优化的开关...

晨曦之光
2012/05/23
1K
0
一个典型的 C++ 程序员成长经历

1. 完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer" 感觉 C++ 像大杂烩(多编程范型),各种精妙的语法特性 (friend, virtual/RTTI, c......

晨曦之光
2012/05/16
580
0
C++ 书籍大汇

C++ 书籍大汇 C++ 书籍大汇 语言基础入门: 1. C++ Primer 《C++入门》(通常不用中文名) by Stanley B. Lippman 有第三版和第四版,如其名,是C++入门的不二选择,是全面广泛的参考书目,内...

长平狐
2012/09/20
315
0
典型的 C++ 程序员成长经历

一个典型的 C++ 程序员成长经历: 1. 完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer" 感觉 C++ 像大杂烩(多编程范型),各种精妙的语......

晨曦之光
2012/05/23
338
0
Effective C++ Notes(读书笔记)

1,视C++为一种语言联邦,大致分为4个部分: A)C。说到底C++仍是以C为基础。区块、语句、预处理器、内置数据类型、数组、指针等等统统来自C。 B)Object-Oriented C++。这部分也就是C with ...

borey
2014/10/12
326
0

没有更多内容

加载失败,请刷新页面

加载更多

在C语言中“静态”是什么意思?

我已经在C代码的不同地方看到了static一词。 这就像C#中的静态函数/类(实现在对象之间共享)吗? #1楼 多文件变量作用域示例 在这里,我说明了静态如何影响多个文件中函数定义的范围。 交流...

javail
4分钟前
3
0
利用 FC + OSS 快速搭建 Serverless 实时按需图像处理服务

作者:泽尘 简介 随着具有不同屏幕尺寸和分辨率设备的爆炸式增长,开发人员经常需要提供各种尺寸的图像,从而确保良好的用户体验。目前比较常见的做法是预先为一份图像存放多份具有不同尺寸的...

阿里巴巴云原生
7分钟前
2
0
前端架构最佳实践

Folders-by-Feature Structure 胜过 Folders-by-Type Structure

lilugirl
17分钟前
3
0
Seata AT 模式启动源码分析

从上一篇文章「分布式事务中间件Seata的设计原理」讲了下 Seata AT 模式的一些设计原理,从中也知道了 AT 模式的三个角色(RM、TM、TC),接下来我会更新 Seata 源码分析系列文章。今天就来分...

后端进阶
19分钟前
3
0
Python中“自我”一词的目的是什么?

Python中self词的目的是什么? 我知道它是指从该类创建的特定对象,但是我看不到为什么要将它显式地作为参数添加到每个函数中。 为了说明这一点,在Ruby中,我可以这样做: class myClass ...

技术盛宴
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部