独立的shared_ptr <t>实现?</t>

时间:2011-08-29 08:03:01

标签: c++ shared-ptr

有没有人知道我可以在我的程序中使用的TR1 shared_ptr(以及其他智能指针)的开源独立实现?


注意:

shared_ptr 的独立实施意味着 shared_ptr 本身需要独立。
不仅仅是包含库。

所以请没有提升

5 个答案:

答案 0 :(得分:5)

shared_ptr的boost实现完全是仅限标头的,因此安装boost以使用它就像下载boost并将其添加到编译器的头搜索路径一样简单。与其他任何独立实现相比,这并没有比增强更难。如果您只想提取shared_ptr组件以进行单独分发,则可以使用Boost BCP

答案 1 :(得分:5)

你可以很容易地破解wxWidgets中的sharedptr.h头来删除一些宏依赖(assert,“explicit”关键字等)。然后,您需要替换或删除内部引用计数变量的原子inc / dec。重命名模板并将其粘贴到命名空间中。然后你将拥有shared_ptr的单文件独立版本。

这样做的好处是,您正在修改的源具有广泛的用途和同行评审。

答案 2 :(得分:3)

您可以使用Boost BCP从Boost中提取组件。

答案 3 :(得分:2)

嗯,我猜我自己创造的东西可能比shared_ptr更好:

template<typename T>
class auto_
{
    T *pValue;
    mutable const auto_<T> *pPrev, *pNext;

public:
    auto_()           : pValue(new T()),  pPrev(NULL), pNext(NULL) { }
    auto_(T *pValue)  : pValue(pValue),   pPrev(NULL), pNext(NULL) { }
    auto_(const T &v) : pValue(new T(v)), pPrev(NULL), pNext(NULL) { }

    auto_(const auto_<T> &o) : pValue(o.pValue), pPrev(&o), pNext(NULL)
    { o.pNext = this; }

    virtual ~auto_()
    {
        const auto_<T> *const pPrev = this->pPrev, *const pNext = this->pNext;
        if (pPrev != NULL) { pPrev->pNext = pNext; }
        if (pNext != NULL) { pNext->pPrev = pPrev; }
        if (pPrev == NULL && pNext == NULL) { delete this->pValue; }
        this->pPrev = this->pNext = NULL;
        this->pValue = NULL;
    }

    auto_<T>& operator=(const auto_<T>& other)
    {
        if (this != &other)
        {
            this->~auto_();
            this->pValue = other.pValue;
            this->pPrev = &other;
            this->pNext = other.pNext;
            if (other.pNext != NULL) { other.pNext->pPrev = this; }
            other.pNext = this;
        }
        return *this;
    }

    operator   T&() { return *this->pValue; }
    operator   T*() { return  this->pValue; }
    T* operator->() { return  this->pValue; }
    T& operator *() { return *this->pValue; }

    operator   const T&() const { return *this->pValue; }
    operator   const T*() const { return  this->pValue; }
    const T* operator->() const { return  this->pValue; }
    const T& operator *() const { return *this->pValue; }

};

样本用法:

template<typename T>
T recurse(T value, int depth)
{
    if (depth > 0) { T result = recurse(value, depth - 1); return result; }
    else { return value; }
}

auto_<int> test()
{
    printf("Value: %d\n", *recurse(auto_<int>(10), 3));
    auto_<int> p1 = recurse<auto_<int> >(5, 3);
    printf("Value: %d\n", *p1);
    auto_<int> p2 = 3;
    p1 = p2;
    p2 = p1;
    return p2;
}

使用起来比shared_ptr,恕我直言。

更容易使用

是否有任何我错过的陷阱(除了显而易见的线程 - 不安全)?

任何(建设性的)批评都赞赏。

答案 4 :(得分:2)

我一直在寻找这样的事情 - 就像你一样,我有一个项目,其中包括大量的Boost是完全不可接受的。

我发现了这个:

http://www.lri.fr/~marc/EO/eo/doc/html/shared__ptr_8h-source.html

我不知道代码质量,因为它是GPL2,这意味着我不能在我的专有代码中使用它,但它似乎没有依赖性。但它确实似乎是你问题的答案。