gpt4 book ai didi

c++ - 如何重载 static 和 dynamic_pointer_cast

转载 作者:太空宇宙 更新时间:2023-11-04 14:08:13 31 4
gpt4 key购买 nike

我有一个如下所示的智能指针类:

template <class T>
class Sptr {
template<typename U> friend class Sptr;

template <typename T1, typename T2>
friend bool operator==(const Sptr<T1> &a, const Sptr<T2> &b);
private:
T* obj;//pointer to current obj
RC* ref; //reference counter
std::function<void()> destroyData;
bool ok_;

public:
Sptr();
~Sptr();

template <typename U>
Sptr(U *);

Sptr(const Sptr &);

template <typename U>
Sptr(const Sptr<U> &);

template <typename U>
Sptr<T> &operator=(const Sptr<U> &);

Sptr<T> &operator=(const Sptr<T> &);

void reset();

T* operator->() const
{return obj;};

T& operator*() const
{return *obj;};

T* get() const
{return obj;};

explicit operator bool() const {
return ok_;
}


};

到目前为止一切正常,我想为 static_pointer_castdynamic_pointer_cast 编写函数。我不知道如何继续前进。谁能指导我正确的方向。下面是一个示例测试代码,我打算通过它来测试它。 (c++11 事情没问题)

// Test static_pointer_cast.
{
Sptr<Derived> sp(new Derived);
Sptr<Base1> sp2(sp);

Sptr<Derived> sp3(static_pointer_cast<Derived>(sp2));
}

// Test dynamic_pointer_cast.
{
Sptr<Derived_polymorphic> sp(new Derived_polymorphic);
Sptr<Base_polymorphic> sp2(sp);

Sptr<Derived_polymorphic> sp3(dynamic_pointer_cast<Derived_polymorphic>(sp2));
Sptr<Derived_polymorphic> sp4(static_pointer_cast<Derived_polymorphic>(sp2));
Sptr<Derived2_polymorphic> sp5(dynamic_pointer_cast<Derived2_polymorphic>(sp2));
assert(!sp5);
}

最佳答案

这两个转换都是模板(可能是 friend ),它们创建一个不同类型的新 Sptr,并通过转换为基础指针进行初始化,并根据需要增加引用计数。主要的复杂之处在于您需要多个不同类型的指针指向同一个完整的对象,并且您需要在最后一个指针(无论是哪种类型)超出范围时使用正确的指针调用删除器。

一种可能的方法是将删除器和原始指针存储在引用计数对象中(顺便说一句,删除器应该一直存在,你只需要一个拷贝!)。每个 Sptr 都持有一个不同类型的原始指针,但当它消失时,它使用存储在删除器引用计数中的指针。

关于c++ - 如何重载 static 和 dynamic_pointer_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049881/

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