- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章如何在C++中通过模板去除强制转换由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C++与C语言相比是一个强类型语言,即对数据类型的匹配程度较C更为严格,这有助于避免程序员在编程过程中由于粗心所犯之错。由于历史原因,C++中仍保留了reinterpret_ cast、static_cast等用于强制类型转换的关键字,但从语言向强类型发展的趋势来看,我们在编程工作中应尽量少使用强制类型转换,模板有助于我们实现这一目的。减少使用强制类型转换的另一个好处,是程序的可维护性更强。 下面让我们通过例子来了解如何通过模板减少程序中的强制转换。图1以简化的形式示例了双向链表(Double-Linked List, DLL)的部分实现内容,以及使用双向链表的代码片段.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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是使用模板改写后的版本。相信读者能轻易地辨别出其中已不存在强制类型转换的身影。 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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++中通过模板去除强制转换的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
给定一个字符串"5 900 000" 我想通过以下模式使用 gsub 去除空格: gsub(/\s/, '') 但这似乎行不通。也没有: gsub(' ', '') 最佳答案 如果你想就地替换,你需要
我编写了一个程序来抓取网站以获取数据并输出到 Excel 表。该程序使用 Microsoft Visual Studio 2010 用 C# 编写。 大多数时候,我从网站获取内容、解析内容并将数据存储
在 MS Access 2007 项目报告中,我有以下(已编辑)查询: SELECT SomeCol FROM SomeTable 问题是, SomeCol 显然包含一些不可见的字符。例如,我看到一个
如 Removing left recursion 中所述,有两种方法可以去除左递归。 使用一些过程修改原始语法以删除左递归 写文法原来没有左递归 人们通常使用什么来删除(没有)ANTLR 的左递归?
我在 CoreData 中存储了一堆艺术家,并希望按名称对它们进行排序,但忽略前缀“the”。例如,“The Beatles”将被排序为“Beatles”,有点像 iTunes/iPod 的做法。 因
我有一个 WebView ,我想从中删除弹性。现在,当滚动小于 webview 的页面时,它会产生弹性效果,显示下面的背景。我想删除这个。 我尝试过执行以下操作,但没有成功。它找到了 WebDynam
我正在调查我们公司使用 Prometheus 从我们在 Kubernetes 上运行的实验中收集统计数据。有计划使用标签来标记我们的云/集群中特定实验的名称。这意味着我们将生成大量标签,这些标签会随着
我正在添加聚合物元素。我想在单击其(自己的)图像时删除元素(自我)。根据封装,我将不得不让 parent 删除 child 。但这也需要为母体生成聚合物元素(我在这里吗??)。 children.ad
现在如果我点击按钮 A,按钮 B 会显示 DropShadow 效果: Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal
我尝试过这个,但它对我不起作用: char * remove_nl(char * newstr) { newstr = strdup(newstr); newstr[strlen(ne
我陷入了两难境地。我有一个图像,我想占据网页的背景。我希望它横跨屏幕的宽度和高度,并保持那个尺寸。当我使用 标签,我不知道如何将它拉伸(stretch)到没有白条的屏幕上。 wspace 和 hspa
Jade .foo .foo 结果 想要的结果 在 haml 中我会做类似 .foo>< 的事情但这在 Jade 中不起作用。我已经搜索并空手而归如何处理这个问题。我如何达到预期的结果
我是 Maven 的新手,当我尝试将我当前的项目从使用 Ant 转换为 -> 使用 Maven 时遇到了问题。 那个项目需要很多 Jar,我在 mvnrepository 上查找这些 jar 并将它们
我需要一个正则表达式来删除 xml 标记开头和结尾之间的空格。例如:有人创建 xml 并将其发送给我,这样我就可以验证、签名并发送到网络服务。 为此,我需要删除标签开头和结尾之间的空格: String
我写了几个方法来将项目添加到数组中,如果它们已经在数组中,它们将被忽略。在对数据结构做了一些研究之后,我意识到我可以通过简单地将它们放在一个集合中来摆脱重复(特别是因为我不关心对象的顺序)。然而,在玩
使用 HighCharts,我想移除 SVG 曲线上的抗锯齿。 到目前为止,我正在使用这个: $('path').each(function(i,j){$(j).attr('shape-renderi
由于某些奇怪的原因(黑色但不是黑色部分),我的 SeekBar 和拇指后面出现随机阴影。我该如何摆脱它? 我的搜索栏: 拇指.xml progress_appearance.xml(有一些
我有一个 Url,我想获取路径部分但没有尾随文件名。如果 Url 是 http://my.com/dir1/dir2/file.ext 那么我想获取 /dir1/dir2 . 我已经尝试了各种拆分(l
我有这个字符串: dataSourceURL = URL(string:"https://api.abc.com/api/p4/products?pid=uid8225&format=json&off
在我的网页中,我有一个菜单 (HorizontalPanel) 应该隐藏在页面的底部。为此,我尝试使用 RootLayoutPanel 类并在其中添加一个 south 小部件,我成功地做到了。但问
我是一名优秀的程序员,十分优秀!