std::find_if Вопрос
От: IROV..  
Дата: 29.07.05 11:33
Оценка:
надо найти в std::vector<CObject *> Обьект с именем.



class FFindObjectByName
{
public:
    FFindObjectByName(const std::string &ObjectName)
    : m_ObjectName(ObjectName)
    {
    }

    bool operator()(const CObject *Object)
    {
        return m_ObjectName == Object->GetName();
    }

private:
    const std::string &m_ObjectName;
};

void CObjectNode::EraseObject(const std::string &ObjectName)
{
    TVectorObject::iterator it_find = 
        std::find_if(
        m_Children.begin(),
        m_Children.end(), 
        FFindObjectByName(ObjectName) );
    
    EraseObject(it_find);
}



както можно заменить функтор предикатом?

Спасибо.
я не волшебник, я только учусь!
Re: std::find_if Вопрос
От: MaximE Великобритания  
Дата: 29.07.05 12:10
Оценка:
IROV.. wrote:

> надо найти в std::vector<CObject *> Обьект с именем.


Вопрос задается раз в неделю. http://rsdn.ru/Forum/?mid=1288456
Автор: MaximE
Дата: 24.07.05


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: std::find_if Вопрос
От: IROV..  
Дата: 29.07.05 12:46
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>IROV.. wrote:


>> надо найти в std::vector<CObject *> Обьект с именем.


ME>Вопрос задается раз в неделю. http://rsdn.ru/Forum/?mid=1288456
Автор: MaximE
Дата: 24.07.05


ME>--

ME>Maxim Yegorushkin


template<typename T_Class, typename T_Member>
class FCompareMember 
: public std::unary_function<T_Class, bool>
{
    typedef T_Member T_Class::* TMemberPtr;
public:
    FCompareMember(TMemberPtr MemPtr, const T_Member& MemVal) 
        : m_MemPtr(MemPtr)
        , m_MemVal(MemVal) 
    {
    }

    bool operator()(const T_Class* obj) const 
    { 
        return obj->*m_MemPtr == m_MemVal; 
    }

private:
    TMemberPtr    m_MemPtr;
    T_Member    m_MemVal;
};

template<typename T_Class, typename T_Member>
    FCompareMember<T_Class,T_Member> compare_member( 
    T_Member T_Class::* MemPtr, const T_Member& MemVal)
{
    return FCompareMember<T_Class,T_Member>(MemPtr,MemVal);
}


Вот написал.. врапер..
Но есть маленький нюанс.. он работает для T_Container< CObject * >
для этого


bool operator()(const T_Class* obj) const 
{ 
    return obj->*m_MemPtr == m_MemVal; 
}



используем.. вот это..

как зделать.. что бы он мог хавать как
T_Container< CObject *>
так и
T_Container< CObject >

неужели


bool operator()(const T_Class* obj) const 
{ 
    return obj->*m_MemPtr == m_MemVal; 
}

+

bool operator()(const T_Class& obj) const 
{ 
    return obj.*m_MemPtr == m_MemVal; 
}




Спасибо
я не волшебник, я только учусь!
Re[3]: std::find_if Вопрос
От: MaximE Великобритания  
Дата: 29.07.05 12:59
Оценка:
IROV.. wrote:

[]

> как зделать.. что бы он мог хавать как

> T_Container< CObject *>
> так и
> T_Container< CObject >
>
> неужели
>
>
>
> bool operator()(const T_Class* obj) const
> {
>     return obj->*m_MemPtr == m_MemVal;
> }
>
> +
>
> bool operator()(const T_Class& obj) const
> {
>     return obj.*m_MemPtr == m_MemVal;
> }
>


Именно так и сделано в boost::bind и boost::lambda. С boost::lambda твой функтор пишется так:

find_if(..., cref(x) == bind(&T::member, _1)); // и для ссылок и для указателей
find_if(..., cref(x) == _1 ->* &T::member); // только для указателей
find_if(..., cref(x) == &_1 ->* &T::member); // только для ссылок


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[3]: std::find_if Вопрос
От: korzhik Россия  
Дата: 29.07.05 13:43
Оценка: 16 (2)
Здравствуйте, IROV.., Вы писали:

[...]

перепиши свой враппер следующим образом:
template<typename T_Class, typename T_Member>
class FCompareMember : public std::unary_function<T_Class, bool>
{
    typedef T_Member T_Class::* TMemberPtr;
public:
    FCompareMember(TMemberPtr MemPtr, const T_Member& MemVal) 
        : m_MemPtr(MemPtr)
        , m_MemVal(MemVal) 
    {
    }

    template<typename ChainedPtr>
    bool operator()(const ChainedPtr& x)const
    {
      return operator()(*x);
    }

    bool operator()(const T_Class& obj)const 
    { 
        return obj.*m_MemPtr == m_MemVal; 
    }

private:
    TMemberPtr  m_MemPtr;
    T_Member    m_MemVal;
};


теперь этому функтору фиолетово чего у тебя лежит в контейнере... хоть сам объект, хоть голый указатель, хоть умный.
Re[4]: std::find_if Вопрос
От: MaximE Великобритания  
Дата: 29.07.05 13:53
Оценка:
korzhik wrote:

[]

> теперь этому функтору фиолетово чего у тебя лежит в контейнере... хоть сам объект, хоть голый указатель, хоть умный.


Хорошая идея с рекурсией — будет работать даже для T**** t.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[5]: std::find_if Вопрос
От: korzhik Россия  
Дата: 29.07.05 14:02
Оценка: :)))
Здравствуйте, MaximE, Вы писали:

ME>korzhik wrote:


ME>[]


>> теперь этому функтору фиолетово чего у тебя лежит в контейнере... хоть сам объект, хоть голый указатель, хоть умный.


ME>Хорошая идея с рекурсией — будет работать даже для T**** t.


Да, мне тоже нравится. Вот она мощь шаблонов!
Как всегда все хорошие идеи придумал не я... почерпнул я это в boost'е
Эх... а так хочется иногда что нибудь придумать!
Идиома Коржа! Неплохо звучит. И потом чтобы Herb Sutter написал про меня
Re[4]: std::find_if Вопрос
От: IROV..  
Дата: 29.07.05 14:11
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, IROV.., Вы писали:


K>[...]


СУПЕР!!!!


    template<typename T_Class, typename T_Member>
    class FCompareMember 
    : public std::unary_function<T_Class, bool>
    {
        typedef T_Member T_Class::* TMemberPtr;
    public:
        FCompareMember(TMemberPtr MemPtr, const T_Member& MemVal) 
            : m_MemPtr(MemPtr)
            , m_MemVal(MemVal) 
        {
        }

        FCompareMember( const FCompareMember &F) 
            : m_MemPtr(F.m_MemPtr)
            , m_MemVal(F.m_MemVal) 
        {
        }

        template<typename ChainedPtr>
            bool operator()(const ChainedPtr& x)const
        {
            return operator()(*x);
        }

        bool operator()(const T_Class& obj) const
        {
            return obj.*m_MemPtr == m_MemVal;
        }

    private:
        TMemberPtr        m_MemPtr;
        const T_Member    &    m_MemVal;
    };

    template<typename T_Class, typename T_Member>
        inline FCompareMember<T_Class,T_Member> 
        compare_mem( T_Member T_Class::* MemPtr, const T_Member& MemVal)
    {
        return FCompareMember<T_Class,T_Member>(MemPtr,MemVal);
    }



Вот что получилось
я не волшебник, я только учусь!
Re[5]: std::find_if Вопрос
От: korzhik Россия  
Дата: 29.07.05 14:31
Оценка: +1
Здравствуйте, IROV.., Вы писали:

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


K>>Здравствуйте, IROV.., Вы писали:


K>>[...]


IRO>Вот что получилось


ну в принципе нормально, только я б на твоём месте задумался бы о стиле именования имён.
Очень уж твой стиль мне режет глаза... ИМХО сейчас наиболее распрастранён STL/BOOST like стиль.
Я бы. например, написал бы так:
//-----------------------------------------------------------------------------
template <typename Class, typename Type>
class member_comparer 
{
    typedef Type Class::*member_ptr_type;
public:
    //-------------------------------------------------------------------------
    member_comparer(member_ptr_type mem_ptr, const Type& mem_val) 
        : m_mem_ptr(mem_ptr),
          m_mem_val(mem_val) 
    {
    }
    //-------------------------------------------------------------------------
    template <typename ChainedPtr>
    bool operator()(const ChainedPtr& x)const
    {
        return operator()(*x);
    }
    //-------------------------------------------------------------------------
    bool operator()(const Class& obj)const
    {
        return obj.*m_mem_ptr == m_mem_val;
    }
    //-------------------------------------------------------------------------
private:
    member_ptr_type m_mem_ptr;
    Type            m_mem_val;
};
//-----------------------------------------------------------------------------
template <typename Class, typename Type>
inline member_comparer<Class, Type> 
make_member_comparer( Type Class::*mem_ptr, const Type& mem_val)
{
    return member_comparer<Class, Type>(mem_ptr, mem_val);
}


ЗЫ
Но это конечно всё субъективно
Re[6]: std::find_if Вопрос
От: IROV..  
Дата: 29.07.05 15:55
Оценка:
внешний интерфейс стараюсь делать std like.
я не волшебник, я только учусь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.