網絡編程中 用到 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;