我有以下模板化的deletor类,我使用unique_ptr来删除C类型。
template<typename T, void (*DeletorFunc)(T*)>
struct CTypeDeletor
{
void operator()(T* ptr)
{
DeletorFunc(ptr);
}
};
int main(void)
{
typedef unique_ptr<CType, CTypeDeletor<CType, CType_free>> CTypePtr;
CTypePtr ctype(CType_new());
// ctype will be deleted when we return from main
}
嗯,只要CType_free的返回类型为&#39; void&#39;就行。但是如果dfree函数的返回类型不是&#39; void&#39;然后我无法使用CTypeDeletor。
有没有办法让CTypeDeletor更通用,以便我可以使用任何返回类型的自由函数?
答案 0 :(得分:1)
您可以通过以下方式使现有解决方案更具通用性:
template<typename T, typename RetType, RetType (*DeletorFunc)(T*)>
struct CTypeDeletor
{
RetType operator()(T* ptr)
{
return DeletorFunc(ptr);
}
};
然而,由于你可以简单地进行
,这是不必要的错综复杂的int main(void)
{
typedef unique_ptr<CType, decltype(&CType_free)> CTypePtr;
CTypePtr ctype(CType_new(), &CType_free);
}
来自cppreference,
Deleter必须是对函数的FunctionObject或lvalue引用的FunctionObject或lvalue引用,可以使用unique_ptr :: pointer类型的参数调用。