unique_ptr模板的释放函数 map的key值比较函数 的用法

网络编程中 用到 SOCKET, 突然编程中 想用unique_ptr 实现自动释放。总结了一下用法:

1. 函数

void sock_fn_deleter(SOCKET* ps)
{
    SOCKET s = *ps;
    closesocket(s);
}


SOCKET sock_test = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
std::unique_ptr < SOCKET, decltype(sock_fn_deleter) *>  ads(&sock_test, sock_fn_deleter);

2. Lamda 表达式   

auto sock_lamda_deleter = [](SOCKET * ps)
                        { 
        SOCKET s = *ps;
        closesocket(s); 
    };



SOCKET sock_test = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
std::unique_ptr < SOCKET, decltype(sock_lamda_deleter)>  ads(&sock_test, sock_lamda_deleter);

3. 使用结构作为模板形参  

 

 struct SockStructDel
    {
        void operator()(SOCKET *ps) const
        {
            SOCKET s = *ps;
            closesocket(s);
        }
    };

   std::unique_ptr < SOCKET, SockStructDel>  ads(&sock_test);

 

对比一下, 使用结构是最简洁的。 可以函数内声明,只用提供类型就可以了。

 

对于常用的map表, 若使用自定义的键值, 用法于此类似。

1. map 键值比较函数

typedef struct _Net_Stroke_ID
{
	int  uid;
	int  oid;

} NetStrokeID_t;

static bool idless(const struct _Net_Stroke_ID & r1, const struct _Net_Stroke_ID & r2)
{
	if (r1.uid < r2.uid)
	{
		return true;
	}
	else if (r1.uid == r2.uid)
	{
		return r1.oid < r2.oid;
	}
	return false;
}

std::map< NetStrokeID_t, int, decltype(idless)*>  tmap(idless);

2. map 键值比较 struct 方法

typedef struct _Net_Stroke_ID
{
	int  uid;
	int  oid;

} NetStrokeID_t;
  

struct LessNetStroke
{
        bool  operator()( const  NetStrokeID_t & r1, const  NetStrokeID_t & r2 ) const
        {
            if ( r1.uid < r2.uid )
            {
                return true;
            }
            else if ( r1.uid == r2.uid )
            {
                return r1.oid < r2.oid;
            }
            return false;
        }
    };

    std::map< NetStrokeID_t,int, LessNetStroke >  tmap;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值