一个巧妙的类型转换

#include <iostream>
using namespace std;
//class B{};
template<typename T>
class Ptr
{
private:
   class Tester {
  private:
    /** Disable delete (by virtue that this is unimplemented). */
    void operator delete (void *);
  };
public:
    Ptr(){m_ptr=0;}
    Ptr(T *ptr){m_ptr=ptr;}
    Ptr(Ptr const &o)
    {
        m_ptr=o.m_ptr;
    }
    ~Ptr(){}
    T* operator->(){return m_ptr;}
    operator Tester *()const;
    //operator B*();
private:
 T*m_ptr;
};
template <typename T>
Ptr<T>::operator Tester * () const
{
  if (m_ptr == 0)
    {
      return 0;
    }
  static Tester test;
  return &test;
}
/*template <typename T>
Ptr<T>::operator B*()
{
    return 0;
}*/
class Test
{
public:
    Test(int i):m_i(i){}
    ~Test(){}
    int GetIndex(){return m_i;}
private:
    int m_i;
};
void fun(Ptr<Test>obj)
{
    if(obj!=0)
    {
        printf("%d\n",obj->GetIndex());
    }else
    {
        printf("is null\n");
    }
}
int main()
{
    Test *test=new Test(2);
    Ptr<Test> obj;
    fun(obj);
    obj=Ptr<Test>(test);
    if(obj!=0)
    {
        printf("%d\n",obj->GetIndex());
    }
    fun(obj);
    return 0;
}

 我在学习ns3中的Ptr中,关于Ptr中的封装的类型不为空的判断,令我十分困惑,就是这一句(if(obj!=0))以上代码并没有重载!=运算符,而且,似乎也没有发生什么隐式转换,但是以上代码可以正确运行。这个巧妙的地方就是Ptr类中内嵌了一个Tester类,而且实现一个转换算子,operator Tester * ()。就是说,编译器遇见obj!=0这个操作时,因为左右对象不一致,会隐式地调用operator Tester * ()这个函数,进行对象转换。如果m_ptr不为零,函数返回类Tester test的地址,使得!=号左右可以进行比较。
 我在代码里增加了一个class B,不过注释掉了。把相应的注释去掉,在编译的时候,就会遇见”error: ambiguous overload for ‘operator!=’ (operand types are ‘Ptr’ and ‘int’)”,这个错误,就不会调用隐式转换函数了,提醒我们需要重载!=。

convert InetSocketAddress to Address

   char *ip="127.0.0.1";
   uint16_t port=1234;
   Address  remoteAddr=InetSocketAddress{ip,port};
   Ipv4Address ipv4=InetSocketAddress::ConvertFrom (remoteAddr).GetIpv4 ();
   uint16_t myport=InetSocketAddress::ConvertFrom (remoteAddr).GetPort();
   NS_LOG_INFO(ipv4<<" "<<myport);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值