网络编程中 用到 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;