Re[5]: std::find_if Вопрос
От:
korzhik
Дата: 29.07.05 14:02
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>korzhik wrote:
ME>[]
>> теперь этому функтору фиолетово чего у тебя лежит в контейнере... хоть сам объект, хоть голый указатель, хоть умный.
ME>Хорошая идея с рекурсией — будет работать даже для T**** t.
Да, мне тоже нравится. Вот она мощь шаблонов!
Как всегда все хорошие идеи придумал не я... почерпнул я это в
boost'е
Эх... а так хочется иногда что нибудь придумать!
Идиома Коржа! Неплохо звучит. И потом чтобы Herb Sutter написал про меня
Re[3]: std::find_if Вопрос
Здравствуйте, 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[5]: std::find_if Вопрос
Здравствуйте, 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);
}
ЗЫ
Но это конечно всё субъективно
От:
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);
}
както можно заменить функтор предикатом?
Спасибо.
я не волшебник, я только учусь!
От:
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[4]: std::find_if Вопрос
От:
MaximE
Дата: 29.07.05 13:53
Оценка:
korzhik wrote:
[]
> теперь этому функтору фиолетово чего у тебя лежит в контейнере... хоть сам объект, хоть голый указатель, хоть умный.
Хорошая идея с рекурсией — будет работать даже для T**** t.
--
Maxim Yegorushkin Posted via RSDN NNTP Server 1.9
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[6]: std::find_if Вопрос
От:
IROV..
Дата: 29.07.05 15:55
Оценка:
внешний интерфейс стараюсь делать std like.
я не волшебник, я только учусь!
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить