考慮一些功能:如何將unique_ptr與更通用的刪除器一起使用?
template<typename F>
void foo(F f) {
std::unique_ptr<int> p = f();
// do some stuff with p
}
因爲unique_ptr
法令默認模板參數,default_delete
,爲D
,傳遞給foo
任何函數對象返回與非默認刪除器未能編譯unique_ptr
。例如,
int x = 3;
foo([&x](){
// use empty deleter
return std::unique_ptr<int>(&x, [](int*){});
});
但是,我可以看到這可能是有用的,我沒有看到它不應該成爲可能的直接原因。解決這個問題有沒有共同的方法?
編輯
的簡單的解決方法是定義foo
而不是使用以下命令:
std::unique_ptr<int, std::function<void(int*)>> p = f();
但我不知道爲什麼,這可能不會被納入接口unique_ptr
?是否有類接口不能提供這個通用屬性的原因?有沒有辦法將這種東西「包裝」成新的定義?
例如,
template<typename T>
using Generic_unique_ptr =
std::unique_ptr<
T,
std::function< void(typename std::unique_ptr<T>::element_type*) >
>;
但因爲它暴露做類似的follwing的潛力,這似乎危險的,
Generic_unique_ptr<int> p(new int());
這將離開刪除器未初始化,並表現出不確定的行爲。也許某種方式可以提供作爲默認刪除器的實例std::default_delete<T>
?
@TemplateRex我不確定它們是否一樣。如何從模板參數「F」推導刪除器類型? – jwalk