在C++中,如果为自定义类型(class)定义了类型转换操作符或没有explicit关键字修饰的单参数构造函数,在需要的时候,编译器会自动执行隐式类型转换。这是一个常识。隐式类型转换是否需要的规则定义于编译器内部,难以窥见,但就我理解,“需要”的意思之一应该是,如果不进行隐式类型转换就找不到相应的重载函数,进行了就能找到的话,编译器理应进行隐式类型转换。
那天我看“委托”这个模式的时候,突然突发奇想,想到了利用隐式类型转换进行非常简单优美的委托的C++实现,不由大喜。
通常的B类要承担A类的委托,代码是这么写,略去构造函数等:
但是,如果B类要代理A类的很多函数甚至全部公有函数,重复地写 形如f() { pa->f(); }的函数定义就非常累人。
我当时的想法是:
理论上,编译器应当发现B类并没有成员函数a_func,并且发现如果执行隐式类型转换就可以调用A类的a_func,从而进行隐式类型转换。这样,就实现了非常轻巧的“完全”委托,或曰一种不是继承的继承。当然,这纯粹是一种hack,肯定不是在实际中应该推荐的代码风格。
遗憾的是,gcc和VC 2005+对于上面这段程序甚至都无法通过编译。这究竟是因为编译器不够smart,还是我对C++标准理解有误,我不知道。只是可惜了,这个突发奇想来的时候,我真的欣喜若狂,觉得这样的代码可以发扬开来,进行一种元编程,从而实现类似于lua中元表那样的概念来处理method not found这样的情况。
可惜够不着,要不我还真的希望C++标准中明确一下隐式类型转换的规则,最好加上这个情况和一些更有趣的情况,呵呵~P.S.一句,热切盼望C++0x中.....
那天我看“委托”这个模式的时候,突然突发奇想,想到了利用隐式类型转换进行非常简单优美的委托的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;}
- operator A() const { return *pA;}
- };
- int main()
- {
- B b;
- b.a_func();
- return 0;
- }
遗憾的是,gcc和VC 2005+对于上面这段程序甚至都无法通过编译。这究竟是因为编译器不够smart,还是我对C++标准理解有误,我不知道。只是可惜了,这个突发奇想来的时候,我真的欣喜若狂,觉得这样的代码可以发扬开来,进行一种元编程,从而实现类似于lua中元表那样的概念来处理method not found这样的情况。
可惜够不着,要不我还真的希望C++标准中明确一下隐式类型转换的规则,最好加上这个情况和一些更有趣的情况,呵呵~P.S.一句,热切盼望C++0x中.....