шаблон Composite в boost
От: Константин Ленин Франция  
Дата: 06.12.05 13:16
Оценка: :)
реализован как нибудь?
Re: шаблон Composite в boost
От: Константин Ленин Франция  
Дата: 06.12.05 16:47
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>реализован как нибудь?


Неужели никто до сих пор не написал супер-шаблон для этой приблуды? Он получается слишком кастомный? Я тут написал, но...хочу увидеть эталон, так сказать
Re[2]: шаблон Composite в boost
От: Angler Россия  
Дата: 06.12.05 17:50
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>Здравствуйте, Константин Ленин, Вы писали:


КЛ>>реализован как нибудь?


КЛ>Неужели никто до сих пор не написал супер-шаблон для этой приблуды? Он получается слишком кастомный? Я тут написал, но...хочу увидеть эталон, так сказать


— где хранить детей(контейнер), или они уже где-тоне хранятся?
— как происходит вызов методов детей? по указателю на метод? используя политики для 100% инлайна?

Много вопросов, а ответы в каждом конкретном случае разные Лепить монстра основанного на стратегиях помоему лишнее.
Я делаю просто так:

//Composite impl
std::for_each(chlidren.begin(), chlidren.end(), 
  boost::bind(&IMyComposite::Method, _1, ...))


шож еще?
Re[3]: шаблон Composite в boost
От: Константин Ленин Франция  
Дата: 07.12.05 12:06
Оценка: :)
Ну что то типа этого:


template <class T>
class Node
{
protected:

    typedef std::vector< T* > container;    
    container    m_ChildNodes;

public:

    T*    m_pObject;    
    T*    m_pParent;

protected:

    template <class U>
    class PointerComparer
    {
        Node<U> m_Object;

    public:

        PointerComparer( U* obj ) : m_Object(obj){}        

        bool operator()( U* right )
        {
            return m_Object.m_pObject==right;
        }        
    };

    template <class U>
    class ReferenceComparer
    {
        const U& m_Object;

    public:

        ReferenceComparer( const U& obj ) : m_Object(obj){}        

        bool operator()( U* right )
        {            
            return m_Object==(*right);
        }        
    };

public:

    Node() : m_pParent(NULL), m_pObject(NULL) {}    

    explicit Node( T* pObject ) : m_pObject(pObject){}    

    bool Add( T* pObject )
    {
        m_ChildNodes.push_back( pObject );
        return true;
    }

    template <class U>
    bool Remove( U* pObject )
    {            
        container::iterator it = std::find_if(m_ChildNodes.begin(), m_ChildNodes.end(), PointerComparer<U>(pObject) );
        if( it!=m_ChildNodes.end() ) m_ChildNodes.erase( it );
        return true;
    }

    template <class U>
    bool Remove( const U& pObject )
    {            
        container::iterator it = std::find_if(m_ChildNodes.begin(), m_ChildNodes.end(), ReferenceComparer<U>(pObject) );
        if( it!=m_ChildNodes.end() ) m_ChildNodes.erase( it );
        return true;
    }    

    std::vector< T* >& ChildNodes()
    {
        return m_ChildNodes;
    }

    const std::vector< T* >& ChildNodes() const
    {
        return m_ChildNodes;
    }

    operator bool()
    {
        return m_pObject!=NULL;
    }

    virtual ~Node(){}
};
Re[4]: шаблон Composite в boost
От: Angler Россия  
Дата: 07.12.05 12:09
Оценка: +1
Здравствуйте, Константин Ленин, Вы писали:

КЛ>Ну что то типа этого:


Ну и где же тут Composite ?
Re[4]: шаблон Composite в boost
От: Глеб Алексеев  
Дата: 07.12.05 12:13
Оценка: 2 (1)
Здравствуйте, Константин Ленин, Вы писали:

А где здесь Composite, собственно? В Composite ключевой момент — снаружи выглядит как обычный объект — наследник Component, но виртуальные Operation1(), Operation2(), ... реализованы вызовом соответствующей операции у всех детей. В твоем примере нет ни Component, ни OperationX, а в них вся соль. Нет смысла Композит в библиотеку совать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: шаблон Composite в boost
От: Константин Ленин Франция  
Дата: 07.12.05 14:39
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Константин Ленин, Вы писали:


ГА>А где здесь Composite, собственно? В Composite ключевой момент — снаружи выглядит как обычный объект — наследник Component, но виртуальные Operation1(), Operation2(), ... реализованы вызовом соответствующей операции у всех детей. В твоем примере нет ни Component, ни OperationX, а в них вся соль. Нет смысла Композит в библиотеку совать.


Ок, не так выразился. Этот класс( собственно являющийся миксином ) позволяет строить структуру, а его наследникам будет проще стать composit'ами)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.