在C++中,如果为自定义类型(class)定义了类型转换操作符或没有explicit关键字修饰的单参数构造函数,在需要的时候,编译器会自动执行隐式类型转换。这是一个常识。隐式类型转换是否需要的规则定义于编译器内部,难以窥见,但就我理解,“需要”的意思之一应该是,如果不进行隐式类型转换就找不到相应的重载函数,进行了就能找到的话,编译器理应进行隐式类型转换。
那天我看“委托”这个模式的时候,突然突发奇想,想到了利用隐式类型转换进行非常简单优美的委托的C++实现,不由大喜。
通常的B类要承担A类的委托,代码是这么写,略去构造函数等:
class A
{
public:
f();
};
class B
{
A*pa;
public:
f(){pa->f();}
};
但是,如果B类要代理A类的很多函数甚至全部公有函数,重复地写形如f(){ pa->f();}的函数定义就非常累人。
我当时的想法是:
#include <iostream>
using namespace std;
class A
{
public:
void a_func()
{
cout<<"A's a_func() is called.";
}
};
class B
{
A* pA;
public:
B():pA(new A){}
~B(){delete pA;pA=0;}
operatorA() const {return *pA;}
};
int main()
{
B b;
b.a_func();
return 0;
}
理论上,编译器应当发现B类并没有成员函数a_func,并且发现如果执行隐式类型转换就可以调用A类的a_func,从而进行隐式类型转换。这样,就实现了非常轻巧的“完全”委托,或曰一种不是继承的继承。当然,这纯粹是一种hack,肯定不是在实际中应该推荐的代码风格。
遗憾的是,gcc和VC 2005+对于上面这段程序甚至都无法通过编译。这究竟是因为编译器不够smart,还是我对C++标准理解有误,我不知道。只是可惜了,这个突发奇想来的时候,我真的欣喜若狂,觉得这样的代码可以发扬开来,进行一种元编程,从而实现类似于lua中元表那样的概念来处理method not found这样的情况。
可惜够不着,要不我还真的希望C++标准中明确一下隐式类型转换的规则,最好加上这个情况和一些更有趣的情况,呵呵~P.S.一句,热切盼望C++0x中.....
分享到:
相关推荐
引子 if语句应该是程序员用的比较多的语句,很多时候都要...隐性类型转换步骤 一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。 二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,t
隐性类型转换,是==引起的转换,下面通过本文给大家分享JavaScript 隐性类型转换步骤,感兴趣的朋友一起看看吧
详解JavaScript中双等号引起的隐性类型转换_.docx
下面分别对这两种数据类型转换进行简要的说明: 1 显式转换 显示转换是将某种数据类型的表达式显式转换为另一种数据类型。常用的是CAST 和 CONVERT 函数。 CAST: CAST ( expression AS data_type ) CONVERT: ...
谨记:在C语言中,当两种不同类型之间运算时,低字节长度类型会向高自己长度类型转换,有符号会向无符号类型转换。 举例子如下: #include void func(void) { int i = 1; unsigned char c1 = 1; signed char c2...
浅析知识经济时代下伪隐性知识的转换.pdf
结合当前建设工程招标过程中存在的诸多隐性风险的现状,分析了隐性风险的形成过程及显性障碍,阐述了建设工程招标准备阶段及招标开标阶段的隐性风险表现,论证了隐性风险的显性后果。最后从提高图纸设计质量、确定合理...
隐性担保与企业杠杆分化--基于中国家电行业的实证分析,王艺霖,贾凯威,本文利用对2010年到2018年A股家用电器行业上市公司季度数据,重点分析隐性担保从规模和所有制两个方面如何影响企业杠杆率走势分化,
高职英语教学隐性育人的推进路径与策略研究
给大家详细介绍了javascript中双等号(==)隐性转换机制,非常不错,具有参考借鉴价值,需要的朋友参考下吧
隐性保险丶市场约束与我国银行业改革.pdf
可作为myeclipse的插件加入,可以检测java代码隐性的bug
隐性知识转移、共享的激励机制研究.pdf
根据指定来路网址隐性跳转代码
—个人隐性知识获得的一种有效方式.pdf
隐性知识水平差异研究一个概念模型.pdf
分析了目前煤炭企业成本管理现状以及存在的问题,提出煤炭企业在进行成本管理时,不能仅局限于财务成本核算方面的成本控制,要有大成本管理观念,特别是要深挖企业的"隐性成本",从而降低企业生产成本。