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;

 

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