如何在C++中通过模板去除强制转换

 更新时间:2015年07月30日 10:04:24   作者:李云  
本文讲解的是如何在C++中通过模板去除强制转换,在编程工作中应尽量少使用强制类型转换,模板有助于我们实现这一目的,需要的朋友可以参考下

C++与C语言相比是一个强类型语言,即对数据类型的匹配程度较C更为严格,这有助于避免程序员在编程过程中由于粗心所犯之错。由于历史原因,C++中仍保留了reinterpret_ cast、static_cast等用于强制类型转换的关键字,但从语言向强类型发展的趋势来看,我们在编程工作中应尽量少使用强制类型转换,模板有助于我们实现这一目的。减少使用强制类型转换的另一个好处,是程序的可维护性更强。
下面让我们通过例子来了解如何通过模板减少程序中的强制转换。图1以简化的形式示例了双向链表(Double-Linked List, DLL)的部分实现内容,以及使用双向链表的代码片段。

class dll_t; 
 
class dll_node_t 
{ 
  friend class dll_t; 
 
public: 
  explicit dll_node_t (); 
 
  void data (void *_p_data) {p_data_ = _p_data;} 
  void *data () {return p_data_;} 
 
private: 
  dll_node_t *prev_; 
  dll_node_t *next_; 
  void *p_data_; 
}; 
 
class channel_t 
{ 
public: 
  channel_t () : node () 
  { 
    node_.data (reinterpret_cast <void *> (this)); 
  } 
 
private: 
  dll_node_t node_; 
}; 


图1 

其中,dll_node_t是双向链表节点的类封装。它除了prev_和next_两个用于保存前一个和后一个节点指针的成员变量外,还有一个用于保存节点数据的p_data_。由于节点所保存数据的具体含义完全取决于链表的使用者,因此p_data_类型被定义为void*,以便容纳任何类型的数据。位于第10和11行的data()函数用于分别设置和获取p_data_变量的值。
 
图中第19至29行的代码示例了channel_t类使用dll_node_t类的片段。在channel_t类的构造函数中,调用data()函数时需要通过强制类型转换的方式将this指针保存到节点的p_data_变量中。不难想象,当通过data()函数获取p_data_中的值时,也得通过强制转换的方式使其变成类型为channel_t的指针(这部分代码在图中并未列出)。
 
图2是使用模板改写后的版本。相信读者能轻易地辨别出其中已不存在强制类型转换的身影。
 

template <typename T_NODE> class dll_t; 
 
template <typename T_DATA> class dll_node_t 
{ 
  friend class dll_t <dll_node_t <T_DATA> >; 
   
public: 
  explicit dll_node_t (); 
 
  void data (T_DATA *_p_data) {p_data_ = _p_data;} 
  T_DATA *data () {return p_data_;} 
   
private: 
  dll_node_t *prev_; 
  dll_node_t *next_; 
  T_DATA *p_data_; 
}; 
 
class channel_t 
{ 
public: 
  channel_t (): node_ () 
  { 
    node_.data (this); 
  } 
   
private: 
  dll_node_t <channel_t> node_; 
}; 

图2

以上就是本文的全部内容,希望对大家熟练使用模板去除强制转换有所帮助。

相关文章

  • 关于C语言程序的内存分配的入门知识学习

    关于C语言程序的内存分配的入门知识学习

    这篇文章主要介绍了关于C语言程序的内存分配的入门知识学习,特别强调了堆与栈的内存空间申请比较,需要的朋友可以参考下
    2015-12-12
  • C语言中函数指针与软件设计经验总结

    C语言中函数指针与软件设计经验总结

    今天小编就为大家分享一篇关于C语言中函数指针与软件设计经验总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言进阶教程之字符串&内存函数

    C语言进阶教程之字符串&内存函数

    对于字符,在计算机内部都是用数字(字符编码)来表示的,而字符串是“字符连续排列”的一种表现,这篇文章主要给大家介绍了关于C语言进阶教程之字符串&内存函数的相关资料,需要的朋友可以参考下
    2021-09-09
  • C++Node类Cartographer开始轨迹的处理深度详解

    C++Node类Cartographer开始轨迹的处理深度详解

    这篇文章主要介绍了C++Node类Cartographer开始轨迹的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 详解C/C++ 的*和&用法

    详解C/C++ 的*和&用法

    这篇文章主要介绍了C/C++ 的*和&的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Opencv实现对象提取与测量

    Opencv实现对象提取与测量

    这篇文章主要为大家详细介绍了基于Opencv实现对象提取与测量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C++中关于[]静态数组和new分配的动态数组的区别分析

    C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下
    2014-08-08
  • C++ 程序抛出异常后执行顺序说明

    C++ 程序抛出异常后执行顺序说明

    这篇文章主要介绍了C++ 程序抛出异常后执行顺序说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • C语言实现图书管理系统(文件数据库)

    C语言实现图书管理系统(文件数据库)

    这篇文章主要为大家详细介绍了C语言实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 关于STL中的map容器的一些总结

    关于STL中的map容器的一些总结

    对于map的学习,或者说是对STL中的容器的学习,要知道每种容器的实现原理,每种适合适合解决什么问题的,才是关键
    2013-09-09

最新评论