代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

克隆问题,我需要使用库的函数而不是新函数创建复制对象

  •  1
  • Tony The Lion  · 技术社区  · 14 年前

    我对C++中的模板有点新,所以请原谅我这个问题是混淆或愚蠢的,我只是想在这里实现一个克隆智能指针,所以我不必为每个类使用我的底层XML库创建复制构造函数,它只使用对象指针而不是智能指针。问题是,我的traits需要使用底层库中的函数创建新对象,我不知道如何在template/traits类中实现这一点。我已经发布了所有的代码和一些评论如下,如果有人可以建议,我将不胜感激。

    #ifndef CLONE_PTR_H
    #define CLONE_PTR_H
    
    #include <algorithm>
    #include <functional>
    #include <xercesc/dom/DOM.hpp>
    #include <xercesc/dom/DOMDocument.hpp>
    
    struct DOMObject_cloner
    {
        static DOMDocument* clone(DOMDocument* pPtr)
        {
            DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));  // this looks wrong, depends on DOMIMplementation_cloner being done really... how do I do this properly
            return pPtr ?  : impl->createDocument(...) //I need this function for a DOMDocument* to be created!!!
        }
    };
    
    struct DOMImplementation_cloner
    {
        static DOMImplementation* clone(DOMImplementation* pPtr)
        {
            return pPtr ? DOMImplementationRegistry::getDOMImplementation(X("Core")) : 0;
        }
    };
    
    template<typename T>
    struct default_clone
    {
        static T* clone(T* pPtr)
        {
            return pPtr ? pPtr->clone() : 0;
        }
    };
    
    
    template <typename T, typename Cloner = default_clone<T> >
        class clone_ptr
        {
        public:
            // types
            typedef T element_type;
    
            typedef element_type value_type;
            typedef const element_type const_value_type;
            typedef value_type* pointer;
            typedef const_value_type* const_pointer;
            typedef value_type& reference;
            typedef const_value_type& const_reference;
    
            // creation
            clone_ptr() :
            mPtr(0)
            {}
    
            explicit clone_ptr(pointer pPtr) :
            mPtr(pPtr)
            {}
    
    
            clone_ptr(const clone_ptr& pOther) :
            mPtr(pOther.get() ? Cloner()(pOther.get()) : 0)
            {}
    
          /*clone_ptr(const clone_ptr& pOther) :
            mPtr(pOther.get() ? pOther->clone() : 0),
            {}*/
    
    
            clone_ptr& operator=(clone_ptr pOther)
            {
                swap(*this, pOther);
    
                return *this;
            }
    
            ~clone_ptr()
            {
                delete get();
            }
    
            // observers
            pointer get() const
            {
                return mPtr;
            }
    
            pointer operator->() const
            {
                return get();
            }
    
            reference operator*() const
            {
                assert(get() != 0);
                return *get();
            }
    
            // modifiers
            pointer release()
            {
                pointer result = mPtr;
                mPtr = 0;
    
                return result;
            }
    
            void reset(pointer pPtr = 0)
            {
                *this = clone_ptr(pPtr);
            }
    
            // utility
            friend void swap(clone_ptr& pFirst, clone_ptr& pSecond)
            {
                std::swap(pFirst.mPtr, pSecond.mPtr);
            }
    
        private:
            pointer mPtr;
            //default_clone Cloner;
        };
    
        template <typename T1>
        bool operator!(const clone_ptr<T1>& pX)
        {
            return pX.get() == 0;
        };
    
        template <typename T1, typename T2>
        bool operator>=(const clone_ptr<T1>& pFirst, const clone_ptr<T2>& pSecond)
        {
            return !(pFirst < pSecond);
        };
    
        // compare
        template <typename T1, typename T2>
        bool operator==(const clone_ptr<T1>& pFirst, const clone_ptr<T2>& pSecond)
        {
            return pFirst.get() == pSecond.get();
        };
    
        template <typename T1, typename T2>
        bool operator!=(const clone_ptr<T1>& pFirst, const clone_ptr<T2>& pSecond)
        {
            return !(pFirst == pSecond);
        };
    
        template <typename T1, typename T2>
        bool operator<(const clone_ptr<T1>& pFirst, const clone_ptr<T2>& pSecond)
        {
            return std::less<void*>()(pFirst.get(), pSecond.get());
        };
    
        template <typename T1, typename T2>
        bool operator<=(const clone_ptr<T1>& pFirst, const clone_ptr<T2>& pSecond)
        {
            return !(pFirst > pSecond);
        };
    
        template <typename T1, typename T2>
        bool operator>(const clone_ptr<T1>& pFirst, const clone_ptr<T2>& pSecond)
        {
            return pSecond < pFirst;
        };
    
    #endif
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Björn Pollex    14 年前

    我不确定我是否理解你的问题,但我发现你的代码有一个问题。 DOMObject_cloner DOMImplementation_cloner default_clone ,就像这样:

    template<>
    struct default_clone<DOMDocument> {
        static DOMDocument* clone(DOMDocument* pPtr)
        {
            DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
            return pPtr ?  : impl->createDocument(...);
        }
    };