gpt4 book ai didi

c++ - 如何实现可以用void实例化的智能指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:04 24 4
gpt4 key购买 nike

一些智能指针模板,例如 boost::shared_ptr,可以用 void 实例化以保存任意对象:

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/sp_techniques.html#pvoid

下面是一个最小的 scoped_ptr 实现。当用 void 实例化时,编译器会提示在取消引用运算符中形成了非法的“对 void 的引用”。似乎“替代失败不是错误”(SFINAE)规则并未涵盖这种情况。

那么如何实现 scoped_ptr 呢?特别是,是否有替代编写模板特化的方法?这将导致大量的代码重复与现实的智能指针实现。

#include <cstdlib>

template<typename T>
void destroy(T* ptr)
{
delete ptr;
}

class scoped_ptr_impl_base
{
public:
virtual ~scoped_ptr_impl_base() { }
};

template<typename T, typename F>
class scoped_ptr_impl : public scoped_ptr_impl_base
{
public:
scoped_ptr_impl(T* ptr, F dtor)
: m_ptr(ptr), m_dtor(dtor)
{
}

virtual ~scoped_ptr_impl()
{
m_dtor(m_ptr);
}

private:
T* m_ptr;
F m_dtor;
};

template<typename T>
class scoped_ptr
{
public:
explicit scoped_ptr(T* ptr = 0)
: m_ptr(ptr),
m_impl(new scoped_ptr_impl<T, void (*)(T*)>(&destroy<T>))
{
}

template<typename F>
scoped_ptr(T* ptr, F dtor)
: m_ptr(ptr),
m_impl(new scoped_ptr_impl<T, F>(ptr, dtor))
{
}

~scoped_ptr()
{
delete m_impl;
}

T& operator*()
{
return *m_ptr;
}

T* operator->()
{
return m_ptr;
}

private:
T* m_ptr;
scoped_ptr_impl_base* m_impl;

scoped_ptr(const scoped_ptr&);
scoped_ptr& operator=(const scoped_ptr&);
};

int main()
{
scoped_ptr<void> p(std::malloc(1), std::free);
// scoped_ptr.cpp: In instantiation of `scoped_ptr<void>':
// scoped_ptr.cpp:76: instantiated from here
// scoped_ptr.cpp:56: error: forming reference to void
// (g++ 4.3.3)

return 0;
}

最佳答案

您可以为引用类型使用类型特征:

template<typename T>
struct type_trait
{
typedef T& reference;
};

template<>
struct type_trait<void>
{
typedef void reference;
};

然后在你的 scoped_ptr_impl 中:

typename type_trait<T>::reference operator*()
{
return *m_ptr;
}

但不确定 void 是否是特化中的正确类型。您希望它返回什么类型?

关于c++ - 如何实现可以用void实例化的智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1312540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com