Login
[C++] Иерархия функторов
NEW 08.11.06 10:11
Задача: для каждого элемента массива нужно выполнить определенную операцию. В некоторых случаях эта операция отличается от стандартной. Напрашивается иерархия функторов, но у Саттера я прочитал:
Идея, в принципе, ясна, но если я не ошибаюсь, разные копии функтора пользуются одним и тем же внутренним объектом Pimpl. Получается, что нужно наследовать не от самого базового функтора, а от Pimpl'а, так ведь?
Существуют какие-то другие паттерны для решения такой проблемы?
В ответ на:
Therefore, function objects must be cheap to copy and monomorphic. But large and/or polymorphic objects are useful, and using them is okay; just hide the size and richness using the Pimpl idiom, which leaves the outer class as the required cheap-to-copy monomorphic type that still accesses rich state.
Therefore, function objects must be cheap to copy and monomorphic. But large and/or polymorphic objects are useful, and using them is okay; just hide the size and richness using the Pimpl idiom, which leaves the outer class as the required cheap-to-copy monomorphic type that still accesses rich state.
Идея, в принципе, ясна, но если я не ошибаюсь, разные копии функтора пользуются одним и тем же внутренним объектом Pimpl. Получается, что нужно наследовать не от самого базового функтора, а от Pimpl'а, так ведь?
Существуют какие-то другие паттерны для решения такой проблемы?
NEW 08.11.06 10:25
in Antwort Simple 08.11.06 10:11
В некоторых случаях эта операция отличается от стандартной.
-----
Хммм... если она отличается для элементов производного типа, то не вижу никаких проблем - все разруливается по типам.
-----
Хммм... если она отличается для элементов производного типа, то не вижу никаких проблем - все разруливается по типам.
NEW 08.11.06 10:33
in Antwort Simple 08.11.06 10:11
Элементы массива преобразовываются в элементы некоего документа. Операция преобразования может отличаться для разных типов документов и состояния конкретного элемента массива. То есть, желательно бы для каждого типа документа сделать отдельный функтор.
По идее, можно было бы сделать одну виртуальную функцию и вызывать ее из operator(), а остальное упрятать в Pimpl. Как это будет?
По идее, можно было бы сделать одну виртуальную функцию и вызывать ее из operator(), а остальное упрятать в Pimpl. Как это будет?
08.11.06 10:34
in Antwort Murr 08.11.06 10:25
Проблема в том, что объект-функтор копируется внутри стандартного алгоритма.
NEW 08.11.06 10:36
in Antwort Simple 08.11.06 10:33
Элементы массива преобразовываются в элементы некоего документа.
Это имхо классическая область применения визитора.
Это имхо классическая область применения визитора.
NEW 08.11.06 10:37
in Antwort Simple 08.11.06 10:34
Эээ... Пишешь конструктор копирования и делаешь его виртуальным. Ну или строишь что-то, что будет разбираться с типами...

NEW 08.11.06 10:57
in Antwort scorpi_ 08.11.06 10:36
То, что я собираюсь сделать, и есть визитор для одного типа элементов, разве не так? Пробежать по массиву, для каждого элемента вызвать абстрактную операцию.
NEW 08.11.06 11:31
in Antwort scorpi_ 08.11.06 11:23
Да. Щас перечитал ту главу для верности. В данном случае, типов элементов у меня один, а визиторов столько, сколько типов документов, правильно? Не пойму, в чем отличие паттерна от for_each.
NEW 13.11.06 16:29
in Antwort Simple 08.11.06 10:11
У меня некоторые проблемы с терминологией (ну или отсутсвие необходимых знаний
), не сможет ли кто нибудь помочь? (только не немецкий - english пожалуйста
)
"объект-функтор, иерархия функторов" - это что?
"банда" - это что?
* Band ?
* Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides ?
"for_each" - это паттерн iterator?


"объект-функтор, иерархия функторов" - это что?
"банда" - это что?
* Band ?
* Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides ?
"for_each" - это паттерн iterator?
NEW 13.11.06 17:38
in Antwort rahimov80 13.11.06 16:29
"объект-функтор, иерархия функторов" - это что?
http://en.wikipedia.org/wiki/Function_object
"банда" - это что?
GoF, Gang of Four, Gamma & Co.
"for_each" - это паттерн iterator?
функция из STL - http://www.sgi.com/tech/stl/for_each.html
http://en.wikipedia.org/wiki/Function_object
"банда" - это что?
GoF, Gang of Four, Gamma & Co.
"for_each" - это паттерн iterator?
функция из STL - http://www.sgi.com/tech/stl/for_each.html
NEW 14.11.06 10:55
in Antwort scorpi_ 13.11.06 17:38
Читая "101 rules...", я вдруг понял, почему моя первоначальная задумка не получилась бы: функтор передается по значению и был бы порезан. Visitor фунциклирует, спасибо еще раз за наводку.
Почему-то у нас в фирме существует непонятное отторжение стандартной библиотеки. Пытаюсь пробить стену :)
Почему-то у нас в фирме существует непонятное отторжение стандартной библиотеки. Пытаюсь пробить стену :)
NEW 17.11.06 14:15
in Antwort scorpi_ 13.11.06 17:38, Zuletzt geändert 17.11.06 17:19 (rahimov80)
Спасибо большое за быстрый и полный (по крайней мере знаешь, где и что искать) ответ.
С трудом, но разобрался: слабо понимаю motivation. Использовать для
for_each - вообще ограниченние, т.к. for_each не допускает полиморфизм для функтора
Век живи, век учись: "банда четырёх" - во как.
Да. Я тоже люблю сокрашения, раньше говорил: "Иди ARM почитай", а сейчас буду говорить:"иди GoF почитай"!
А я уже, грешным делом, подумал, что это "For Each element In group" в VB
До сих пор как в страшном сне:
[propget, id(1), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
[propget, restricted, id(DISPID_NEWENUM), helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] LPUNKNOWN *pVal);
ну и
typedef CComObject< CComEnum <IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > > Enum;

В ответ на:
"объект-функтор, иерархия функторов" - это что?
http://en.wikipedia.org/wiki/Function_object
"объект-функтор, иерархия функторов" - это что?
http://en.wikipedia.org/wiki/Function_object
С трудом, но разобрался: слабо понимаю motivation. Использовать для
for_each - вообще ограниченние, т.к. for_each не допускает полиморфизм для функтора
В ответ на:
"банда" - это что?
GoF, Gang of Four, Gamma & Co.
"банда" - это что?
GoF, Gang of Four, Gamma & Co.
Век живи, век учись: "банда четырёх" - во как.
Да. Я тоже люблю сокрашения, раньше говорил: "Иди ARM почитай", а сейчас буду говорить:"иди GoF почитай"!

В ответ на:
"for_each" - это паттерн iterator?
функция из STL - http://www.sgi.com/tech/stl/for_each.html
"for_each" - это паттерн iterator?
функция из STL - http://www.sgi.com/tech/stl/for_each.html
А я уже, грешным делом, подумал, что это "For Each element In group" в VB
До сих пор как в страшном сне:
[propget, id(1), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
[propget, restricted, id(DISPID_NEWENUM), helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] LPUNKNOWN *pVal);
ну и
typedef CComObject< CComEnum <IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > > Enum;

NEW 17.11.06 15:37
Прошу прошения, я конечно нашёл полиморфизм для функтора в for_each
in Antwort rahimov80 17.11.06 14:15, Zuletzt geändert 17.11.06 17:18 (rahimov80)
В ответ на:
С трудом, но разобрался: слабо понимаю motivation. Использовать для
for_each - вообще ограниченние, т.к. for_each не допускает полиморфизм для функтора
С трудом, но разобрался: слабо понимаю motivation. Использовать для
for_each - вообще ограниченние, т.к. for_each не допускает полиморфизм для функтора
Прошу прошения, я конечно нашёл полиморфизм для функтора в for_each

NEW 19.11.06 20:16
in Antwort rahimov80 17.11.06 15:37
Динамический полиморфизм работает только с указателями и ссылками, а в алгоритм функтор обычно передается по значению.
NEW 20.11.06 12:09
in Antwort Simple 19.11.06 20:16
Я не понимаю Ваше замечание.
Что значит "обычно"? Так
for_each<list<CNode>::iterator, CBaseFactor&>(lstCNode.begin(), lstCNode.end(), theFactor)
я могу использовать? Вот и ссылка.
Что значит "обычно"? Так
for_each<list<CNode>::iterator, CBaseFactor&>(lstCNode.begin(), lstCNode.end(), theFactor)
я могу использовать? Вот и ссылка.
NEW 20.11.06 12:31
in Antwort rahimov80 20.11.06 12:09
Давай на "ты". На "вы" в сети общаться не принято :)
Такой пример:
Такой пример:
class Base
{
virtual void foo();
}
class Derived : public Base
{
virtual void foo();
}
void f(Base a)
{
a.foo();
}
int main()
{
Base b;
f(b);
Derived d;
f(d);
}
Какая из foo будет вызвана во втором случае, Base::foo или Derived::foo?
NEW 20.11.06 12:41
in Antwort Simple 20.11.06 12:31
Simple, если на ты, то не надо меня "лечить" (прошу прошения за жаргон)
В твоем случае будет вызванна Base::foo()
Но если определение void f(Base& a){ a.foo();}, то будет вызванна Derived::foo(). Возражений нет?
А значок & во втором параметре для for_each видел?
В твоем случае будет вызванна Base::foo()
Но если определение void f(Base& a){ a.foo();}, то будет вызванна Derived::foo(). Возражений нет?

А значок & во втором параметре для for_each видел?
