类型转换重载(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 相关的东西,囫囵吞枣,曾经十分模糊的,现在一下就亮了。到底技术在某些方面其实是殊途同归的,旁门左道的技巧,或许让人迷恋,或许让人误入岐途,就看是谁在哪种场合使用罢了。