muduo types.h

转自:https://blog.youkuaiyun.com/xiaoc_fantasy/article/details/79570788

https://blog.youkuaiyun.com/weixin_40021744/article/details/88802969

1、向上转换

template<typename To, typename From>
inline To implicit_cast(From const &f) {
  return f;
}

up_cast时应该使用implicit_cast替换static_cast

 

2、向下转换

template<typename To, typename From>     // use like this: down_cast<T*>(foo);
inline To down_cast(From* f) {                   // so we only accept pointers
  // Ensures that To is a sub-type of From *.  This test is here only
  // for compile-time type checking, and has no overhead in an
  // optimized build at run-time, as it will be optimized away
  // completely.
  if (false) {
    implicit_cast<From*, To>(0);
  }

#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
  assert(f == NULL || dynamic_cast<To>(f) != NULL);  // RTTI: debug mode only!
#endif
  return static_cast<To>(f);
}

 

实例:

class Top {};
class MiddleA :public Top {};
class MiddleB :public Top {};
class Bottom :public MiddleA, public MiddleB {};

void Function(MiddleA& A)
{
    std::cout << "MiddleA Function" << std::endl;
}
void Function(MiddleB& B)
{
    std::cout << "MiddleB Function" << std::endl;
}

template<typename To, typename From>
inline To implicit_cast(From const &f) {
    return f;
}

//MiddleA implicit_cast(Top const &top) {
//    return top;
//}
template<typename To, typename From>     // use like this: down_cast<T*>(foo);
inline To down_cast(From* f)                     // so we only accept pointers
{
    // Ensures that To is a sub-type of From *.  This test is here only
    // for compile-time type checking, and has no overhead in an
    // optimized build at run-time, as it will be optimized away
    // completely.
    if (false)
    {
        implicit_cast<From*, To>(0);
    }

#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
    assert(f == NULL || dynamic_cast<To>(f) != NULL);  // RTTI: debug mode only!
#endif
    return static_cast<To>(f);
}


int main()
{
    Bottom bottom;
    Top top;
    //Function(static_cast<MiddleB&>(top));
    //Function(implicit_cast<MiddleA, Top>(top));
    //Function(implicit_cast<MiddleA, Bottom>(bottom));
    
    //Function(bottom);
    //Function(static_cast<MiddleA&>(bottom));

    MiddleB *pTop = &bottom;
    MiddleB *pBottom = down_cast<MiddleB *>(&top);
    getchar();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值