在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
5. 特别注意的是,null和undefined在进行隐性类型转换时,彼此被视为相等(null == undefined),但它们与任何其他值比较时都会返回false。在JavaScript中,null与undefined不等于任何其他值,包括它们自己。 6. 当...
在JavaScript中,双等号(==)用于比较两个值是否相等,但在这个过程中,它可能会引起隐性类型转换,即在比较之前自动将不同类型的值转换为同一类型。这种转换有时会导致意料之外的结果,因此理解其工作原理对编写...
其中,隐性知识作为企业核心能力的重要组成部分,其转换尤为值得关注。然而,传统的隐性知识概念存在一定的局限性,因此引入了“伪隐性知识”的概念。 隐性知识,最早由波兰尼提出,是指个人无法清晰表达,源自个体...
2. **有符号类型向无符号类型转换**:如果一个有符号类型与一个无符号类型进行运算,有符号类型会被转换为无符号类型。这是因为在无符号类型中,所有数值都是非负的,因此无法表示负数的二进制补码。在这种情况下,...
下面分别对这两种数据类型转换进行简要的说明: 1 显式转换 显示转换是将某种数据类型的表达式显式转换为另一种数据类型。常用的是CAST 和 CONVERT 函数。 CAST: CAST ( expression AS data_type ) CONVERT: ...
在JavaScript中,判断值相等有两种操作符,即双等号(==)...在编写JavaScript代码时,为了保证代码的正确性和可预测性,通常推荐使用三等号(===)进行严格相等的判断,这样可以避免因隐性类型转换带来的潜在问题。
隐性知识转移与共享的激励机制研究是一个复杂而重要的领域,尤其在当今知识经济时代,企业竞争的关键往往在于能否有效地管理和利用内部的隐性知识。本文深入探讨了隐性知识的特性及其转移共享过程中的激励困境,提出...
隐性知识,这一概念由英国哲学家迈克尔·波兰尼于1958年首次提出,指的是那些难以通过书面文字、图表或公式明确表达的知识类型(Polanyi, 1958)。隐性知识具有非正式、主观和个人化的特点,它通常包含直觉、技能、...
2. 在项目设置中,选择DLL作为项目类型,确定它是隐性链接还是显性链接。对于隐性链接,你需要生成对应的导入库(.lib)文件;对于显性链接,你只需要导出函数声明。 3. 编写DLL的实现,包括导出函数和可能的数据。 ...
首先,隐性负债主要可以包括以下几个方面:1)明股实债,这主要是指企业通过发行可转换债券、优先股等金融工具来获取资金,但这些债务的实质是股权融资;2)记入其他流动负债、其他非流动负债、其他应付款、长期应...
结合当前建设工程招标过程中存在的诸多隐性风险的现状,分析了隐性风险的形成过程及显性障碍,阐述了建设工程招标准备阶段及招标开标阶段的隐性风险表现,论证了隐性风险的显性后果。最后从提高图纸设计质量、确定合理...
教师提问、指令以及母语的使用都可能是教师隐性知识的体现,而学生通过与教师的互动构建自己的隐性知识。数据挖掘技术通过关联规则可以量化分析教师的隐性知识和学生的隐性知识构建过程。 关联规则挖掘是一种发现...