Re[4]: Что использовать из boost'а вместо reference counter
От: _ds_  
Дата: 16.06.10 09:19
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, _ds_, Вы писали:


__>>>Может вам подойдет boost::intrusive_ptr ?

__>>Тоже вариант.
__>>А насколько корректно использование здесь shared_count из boost/smart_ptr/detail/shared_count.hpp?

__>Все что есть в бусте можно использовать.

__>Классы которые лежат в директории details не дают гарантию интерфейса, т.е. могут измениться в следующей версии хоть полностью.

__>Почитайте туториалы и примеры boost smart ptr, может найдется то, что вам нужно.


__>В любом случае если вам он подходит и сокращает время, то надо юзать


Ясно, спасибо

Решил таки использовать intrusive_ptr. Для упрощения работы с ним написал такой вот класс:

// initialCounterValue equal to zero if we use intrusive_ptr<MyClass> p(new MyClass); 
// initialCounterValue equal to one if we use intrusive_ptr<MyClass> p(new MyClass, false); 
template<typename T, long initialCounterValue = 0>
class RefCountable {
    friend void intrusive_ptr_add_ref(RefCountable<T> const* p) {
        // increase reference count
        ::InterlockedIncrement(&p->m_refCount);
    }

    friend void intrusive_ptr_release(RefCountable<T> const* p) {
        // decrease reference count and delete object if reference count became equal to zero
        if (0 == ::InterlockedDecrement(&p->m_refCount)) {
            delete p;
        }
    }

protected:
    // constructor
    RefCountable() : m_refCount(initialCounterValue) {}

    // copy constructor
    RefCountable(RefCountable const&) : m_refCount(initialCounterValue) {}

    // assign operator
    RefCountable& operator=(RefCountable const&) {
        return *this;
    }

    // virtual destructor
    virtual ~RefCountable() {}

private:
    long mutable m_refCount;
};


Мне только не нравится, что наследование от него должно быть обязательно public.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.