以下のようなスマート ポインター クラスがあります。
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_cast
今まではすべて問題なく動作していたので、との関数を書きたいと思いdynamic_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);
}