隐性类型转换的突发奇想与失望

 在C++中,如果为自定义类型(class)定义了类型转换操作符或没有explicit关键字修饰的单参数构造函数,在需要的时候,编译器会自动执行隐式类型转换。这是一个常识。隐式类型转换是否需要的规则定义于编译器内部,难以窥见,但就我理解,“需要”的意思之一应该是,如果不进行隐式类型转换就找不到相应的重载函数,进行了就能找到的话,编译器理应进行隐式类型转换。

那天我看“委托”这个模式的时候,突然突发奇想,想到了利用隐式类型转换进行非常简单优美的委托的C++实现,不由大喜。

通常的B类要承担A类的委托,代码是这么写,略去构造函数等:

  1. class A
  2. {
  3. public:
  4.      f();
  5. };

  6. class B
  7. {
  8.      A * pa;
  9. public:
  10.      f() { pa->f(); }
  11. };

但是,如果B类要代理A类的很多函数甚至全部公有函数,重复地写 形如f() { pa->f(); }的函数定义就非常累人。

我当时的想法是:

  1. #include <iostream>

  2. using namespace std;

  3. class A
  4. {
  5.     public:
  6.         void a_func()
  7.         {
  8.             cout << "A's a_func() is called.";
  9.         }
  10. };

  11. class B
  12. {
  13.     A * pA;
  14.     public:
  15.         B() : pA(new A) {}
  16.         ~B() { delete pA; pA = 0;}
  17.         operator A() const { return *pA;}
  18. };


  19. int main()
  20. {
  21.     B b;
  22.     b.a_func();

  23.     return 0;
  24. }
理论上,编译器应当发现B类并没有成员函数a_func,并且发现如果执行隐式类型转换就可以调用A类的a_func,从而进行隐式类型转换。这样,就实现了非常轻巧的“完全”委托,或曰一种不是继承的继承。当然,这纯粹是一种hack,肯定不是在实际中应该推荐的代码风格。

遗憾的是,gcc和VC 2005+对于上面这段程序甚至都无法通过编译。这究竟是因为编译器不够smart,还是我对C++标准理解有误,我不知道。只是可惜了,这个突发奇想来的时候,我真的欣喜若狂,觉得这样的代码可以发扬开来,进行一种元编程,从而实现类似于lua中元表那样的概念来处理method not found这样的情况。

可惜够不着,要不我还真的希望C++标准中明确一下隐式类型转换的规则,最好加上这个情况和一些更有趣的情况,呵呵~P.S.一句,热切盼望C++0x中.....




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值