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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章