类型转换重载(conversion operators)

 以前在看<windows核心编程>的时候,看到一个很奇怪的重载:operator Proc* ()

 那时对c++了解得还不多,看到这个写法费解了老半天,没有参数,没有返回值,有些析构函数的范儿。

 又带着个奇怪operator关键字,想必是做和操作符重载相关的东西。

 后面了解到,其实是用来做类型转换的,定义这个类被强制类型转换为某种类型时,所发生的行为和结果。

class con
{

  public:
    
     operator const char* () const
      {
         return "hello world";
       }

}


con var;

const char* str = (const char*) var;

cout << str << endl;

//hello world.

 这种写法在某些情况下很有用,但一般来说,用得不多。

 我自己对这些技巧一直也没有太多兴趣,隐隐觉得,类型转换在面向对象的世界里,本就是应该规避的,这样的写法岂不相悖?

 总之不够名门正宗,不用也罢。

 前些天看到篇流传比较广的老文章:http://www.drdobbs.com/cpp/generic-change-the-way-you-write-excepti/184403758?pgno=3

 里面介绍了后面被广泛引用的ScopeGard的概念与实现。

 其中在实现对Reference的操作时写了一段这样的代码: 

template <class T>
class RefHolder
{
    T& ref_;
public:
    RefHolder(T& ref) : ref_(ref) {}
    operator T& () const
    {
        return ref_;
    }
};
template <class T>
inline RefHolder<T> ByRef(T& t)
{
    return RefHolder<T>(t);
}

其中这一行:operator T& () const

让我在读代码的过程中,脑袋又卡壳了一下。忽然想起不久前,在看boost share_ptr时看到的与reference 相关的东西,囫囵吞枣,曾经十分模糊的,现在一下就亮了。到底技术在某些方面其实是殊途同归的,旁门左道的技巧,或许让人迷恋,或许让人误入岐途,就看是谁在哪种场合使用罢了 

原文地址:https://www.cnblogs.com/catch/p/3087757.html