考虑一些功能:
template<typename F>
void foo(F f) {
std::unique_ptr<int> p = f();
// do some stuff with p
}
因为unique_ptr
规定了默认模板参数 , default_delete
for D
,所以任何传递给foo
返回 aunique_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*) >
>;
但这似乎很危险,因为它暴露了做以下事情的潜力,
Generic_unique_ptr<int> p(new int());
这将使删除器未初始化并表现出未定义的行为。也许某种方式可以提供一个作为默认删除器的实例? std::default_delete<T>