在C++中,我们可以使用std::unique_ptr
和std::make_unique
来实现支持ADL的原地生成unique指针。
首先,我们需要定义一个自定义的删除器函数,用于在unique指针释放资源时进行特定的操作。然后,我们可以使用该删除器函数来创建unique指针,并将其传递给std::unique_ptr
的构造函数或std::make_unique
函数。
下面是一个示例代码:
#include <memory>
// 定义自定义的删除器函数
struct MyDeleter {
template <typename T>
void operator()(T* ptr) const {
// 进行特定的资源释放操作
// 例如,释放动态分配的内存或关闭文件等
delete ptr;
}
};
// 使用自定义删除器函数创建unique指针
template <typename T>
std::unique_ptr<T, MyDeleter> make_unique_with_deleter(T* ptr) {
return std::unique_ptr<T, MyDeleter>(ptr, MyDeleter());
}
// 使用std::make_unique生成unique指针
template <typename T, typename... Args>
std::unique_ptr<T> make_unique(T* ptr, Args&&... args) {
return make_unique_with_deleter(new T(std::forward<Args>(args)...));
}
// 示例使用
class MyClass {
public:
MyClass(int value) : value_(value) {
std::cout << "MyClass constructor: " << value_ << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor: " << value_ << std::endl;
}
private:
int value_;
};
int main() {
// 使用std::make_unique生成unique指针
auto ptr1 = make_unique<MyClass>(1);
// 使用自定义删除器函数创建unique指针
auto ptr2 = make_unique_with_deleter(new MyClass(2));
return 0;
}
上述代码定义了一个自定义的删除器函数MyDeleter
,它可以用于释放资源。然后,我们定义了两个函数make_unique_with_deleter
和make_unique
,分别用于创建带有自定义删除器的unique指针和使用std::make_unique
生成unique指针。
在main
函数中,我们分别使用make_unique
和make_unique_with_deleter
创建了两个unique指针ptr1
和ptr2
,并输出了它们的构造和析构信息。
这样,我们就实现了支持ADL的原地生成unique指针的解决方法。