void mydeleter(string *pdel)
{
delete pdel;
pdel = nullptr;
//可以打印日志
cout<<"mydeleter"<<endl;
}
class CallableObject
{
void operator()(string *pdel)
{
delete pdel;
cout << "delete with callable object" << endl;
}
};
void test19(){
// a.1
typedef void(*fp)(string *);
unique_ptr<string, fp> ps1(new string("good luck"), mydeleter);
//a.2
using fp2 = void(*)(string *);
unique_ptr<string, fp2> ps2(new string("good luck"), mydeleter);
//a.3
typedef decltype(mydeleter)* fp3; //decltype()返回函数类型void(string *),所以要加*,现在fp3应该是void *(string *)
unique_ptr<string, fp3> ps3(new string("good luck"), mydeleter);
//a.4
unique_ptr<string, decltype(mydeleter)*> ps4(new string("good luck"), mydeleter);
//a.5,lambda表达式,可以理解成operator()类类型对象
auto mydella = [](string *pdel)->void{
delete pdel;
pdel = nullptr;
cout<<"mydella"<<endl;
};
//注意,lambda表达式mydella被编译器理解成对象(即ps5的参2),所以我们类型不能加*,否则地址与对象不匹配
//而上面的函数名mydeleter代表是首地址,需要加*地址符号进行匹配。(对象不是对象,&对象才是地址)
unique_ptr<string, decltype(mydella)> ps5(new string("good luck"), mydella);
//a.6 使用可调用对象
unique_ptr<string, CallableObject> ps6(new string("good luck"), CallableObjcet());
//a.7
CallableObject obj;
unique_ptr<string, CallableObject> ps7(new string("good luck"), obj);
//a.8
CallableObject *pObj = nullptr;
unique_ptr<string, CallableObject> ps7(new string("good luck"), (*pObj));
}
网友评论