我试图实现一个std::unique_ptr
工厂,我可以用这样的:包装打造的std ::的unique_ptr与普通函数删除器
auto fd = my_make_unique<fclose>(fopen("filename", "r"));
即,通过删除器功能作为一个模板参数。
我在C++ 11最好的尝试是:
template<typename D, D deleter, typename P>
struct Deleter {
void operator()(P* ptr) {
deleter(ptr);
}
};
template<typename D, D deleter, typename P>
std::unique_ptr<P, Deleter<D, deleter, P>> my_make_unique(P* ptr)
{
return std::unique_ptr<P, Deleter<D, deleter, P>>(ptr);
}
在C++ 14它是干净多了:
template<typename D, D deleter, typename P>
auto my_make_unique(P* ptr)
{
struct Deleter {
void operator()(P* ptr) {
deleter(ptr);
}
};
return std::unique_ptr<P, Deleter>(ptr);
}
但两者solutuions需要我传球的&fclose
类型之前fclose
本身作为模板参数:
auto fd = my_make_unique<decltype(&fclose), fclose>(fopen("filename", "r"));
是否有可能摆脱decltype(&fclose)
C++ 11中的模板参数?在C++ 14中怎么样?
编辑:为什么这个问题不是RAII and smart pointers in C++的重复:引用的问题是关于C++中的一般RAII技术,并且其中一个答案可以用于此目的。我已经熟悉RAII模式,以及std::unique_ptr
是如何解决的,但我关心的是如何在与C库交互时遇到的这种常见情况下构建更易于使用的抽象。
'FILE *'只是大家熟悉的一个例子。这对于与充满'create_()'和'destroy_ ()'函数的C库进行交互最有用。无论如何,'*'和' - >'也可用于普通的'FILE *'指针,并且它在'std :: unique_ptr'中也不会更糟。 –
lvella
@Ivella参见http://stackoverflow.com/questions/395123/raii-and-smart-pointers-in-c特别是[this](http://stackoverflow.com/a/395168/8877)回答哪些区别内存和任意资源之间。 –
我不同意这个重复标记,我的问题更具体。 – lvella