随笔 - 54  文章 - 0  评论 - 184  阅读 - 58万

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

posted on   twoon  阅读(1411)  评论(4编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
< 2013年5月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示