`
utensil
  • 浏览: 150551 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

在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中.....

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics