Конференция "Прочее" » Замыкания для методов классов в C++. Как?
 
  • Городской Шаман (12.12.08 22:20) [0]
    Как самым простым способом в С++ реализовать замыкания для объектных функций?

    Аналог делфийского:
    TGetIntVal = function: Integer of object;



    Вроде бы в boost нечто такое было, только найти не могу.
  • Городской Шаман (12.12.08 22:24) [1]
    Конечно я могу реализовать так, но нужно указывать имя класса. А можно ли в динамике?

    typedef int (ClassName::*TGetIntVal)();

  • Сергей М. © (12.12.08 22:25) [2]

    > замыкания


    Это ж надо так извратиться - назвать декларацию [прото]типа "замыканием")
  • Городской Шаман (12.12.08 22:33) [3]
    Ну так борланд называет из в своём CBuilder - __closure, что в переводе значит замыкание.
    typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender)

    ;
  • Сергей М. © (12.12.08 22:42) [4]

    > что в переводе значит замыкание


    Заглушка, затычка, квача в конце-концов - но не замыкание же !
    Нельзя же так "в лоб" переводить)
  • Городской Шаман (12.12.08 22:44) [5]

    > Сергей М. ©   (12.12.08 22:42) [4]


    В книгах по computer science это тоже называется термином "замыкание".

    Так вот хотелось бы особую компиляторную магию borland перенести на стандарт C++.
  • Сергей М. © (12.12.08 23:01) [6]

    > В книгах по computer science это тоже называется термином
    > "замыкание".


    Мало ли у нас авторов-переводчиков, не отягощенных бременем ответственности за "правильные жаргонизмы")

    С какого бы бодуна ни были парни из Борланда, когда специфицировали этот "клозюр", все-таки речь, согласись, шла об обычном делегировании
  • lucy (12.12.08 23:31) [7]
    http://www.boost.org/doc/libs/1_37_0/doc/html/function.html

    или используй указатели на методы (->*).
  • oxffff © (12.12.08 23:54) [8]

    > Сергей М. ©   (12.12.08 22:42) [4]


    Вам бы не мешало освежить свои знания.

    http://en.wikipedia.org/wiki/Closure_(computer_science)

    In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When called, the function can access these variables.

    Так вот захват методом окружения вызова(читай объекта) есть суть процесса замыкания.

    Но никак
    не Заглушка,
    не затычка,
    не квача в конце-концов. :)
  • Дятел © (13.12.08 05:10) [9]
    Городской Шаман   (12.12.08 22:20)
    Как самым простым способом в С++ реализовать замыкания для объектных функций?

    Да нету способа. Страуструп об этом просто не подумал. Папа Борланд подумал, а Страуструп - ни фига.
  • Григорьев Антон © (13.12.08 08:32) [10]

    > Сергей М. ©   (12.12.08 23:01) [6]
    > Мало ли у нас авторов-переводчиков, не отягощенных бременем
    > ответственности за "правильные жаргонизмы")

    Много раз встречал перевод термина closure, и везде это было замыкание. Правда, впервые вижу, чтобы это слово употребяли по отношению к простым ссылкам на функции. Обычно его используют только в функциональных языках, в которых есть функции высших порядков, т.е. функции, результатом работы которых являются другие функции. Причём, не как в Delphi или C++, указатели на ранее объявленные функции, а именно новые функции, которые конструируются в run-time. И эти сконструированные функции называются замыканиями, потому что они замыкают на себя контекст той функции, которая их сконструировала.

    Свойствами замыкания отчасти обладают анонимные функции в D2009, но никак не ссылки на методы класса. И почему Borland употребил это слово, мне тоже непонятно.
  • oxffff © (13.12.08 13:57) [11]

    > Григорьев Антон ©   (13.12.08 08:32) [10]
    Свойствами замыкания отчасти обладают анонимные функции в D2009, но никак не ссылки на методы класса. И почему Borland употребил это слово, мне тоже непонятно.


    Свойствами замыканий не отчасти, а обладают анонимные функции D2009.

    В том то и дело, что указатель на метод - это просто указатель на код. А указатель на метод объекта(.. of object) - это указатель код + окружение метода, т.е объект. Это в чистом виде замыкание, т.е неявно переданный контекст вызова. В С++ от Microsoft этого нет, а в СBuilder это есть.
  • Городской Шаман (13.12.08 17:14) [12]

    > Дятел ©   (13.12.08 05:10) [9]
    >
    > Городской Шаман   (12.12.08 22:20)
    > Как самым простым способом в С++ реализовать замыкания для
    > объектных функций?
    >
    > Да нету способа. Страуструп об этом просто не подумал. Папа
    > Борланд подумал, а Страуструп - ни фига.


    Есть, там немного нарушаются стандарты С++, но на всех известных компиляторах работает.
    http://www.rsdn.ru/article/cpp/fastdelegate.xml

    Ну и boost::function, но это более медленный способ(по вызову).
  • Городской Шаман (13.12.08 17:18) [13]
    Вот пример использования применимо к моей проблематике


    #include "FastDelegate.h"

    class RenderClass{
    public:
    virtual int GetInt(){return 10;}
    ;
    };

    class CustomRenderClass: public RenderClass{
    public:
    virtual int GetInt(){return 15;}
    ;
    };

    typedef fastdelegate::FastDelegate0<int> TDGetInt;

    class DabClass{
    public:
    TDGetInt dGetInt;
    }
    ;

    void _TestDelegate(){
    CustomRenderClass rdc;
    DabClass dc;

    dc.dGetInt = NULL;
    dc.dGetInt = fastdelegate::MakeDelegate(&rdc,&CustomRenderClass::GetInt);
    int _res = dc.dGetInt();
    }


  • lucy (13.12.08 20:39) [14]
    Городской Шаман   (13.12.08 17:14) [12]
    >Есть, там немного нарушаются стандарты С++, но на всех известных компиляторах работает.

    Все, кому было нужно, эту статью давно уже прочитали. Вы должны ясно осознавать, что то или определенное средство налагает на своего пользователя ряд фундаментальных ограничений, и попытки преступить эти ограничения с помощью "магии" - есть ересь.
    С++ предполагает отсутствие магии (хотя не отменяет мистики), но взамен предоставляет средства, с помощью которых то чего нет в C++ может быть реализовано на самом C++. Это часть его идеологии. Без магии это может выглядеть странно и, может быть многословно, но вы должны мириться с этим, если не хотите выходить за фундаментальные ограничения, налагаемые языком. Вы должны смириться и с тем, что будучи связанным стандартом, C++ развивается медленно, и принимать его таким какой он есть. Только так вы сможете достичь просветления. Пожалуйста, не позорьтесь перед общественностью.
  • Городской Шаман (13.12.08 21:27) [15]

    > lucy   (13.12.08 20:39) [14]


    Я не отношусь к религиозным фанатикам языка. Для меня язык всего лишь инструмент, как молоток, а не предмет для поклонения. И если я вижу возможность писать на C++ как я привык на Delphi, то с моей точки зрения это всего лишь третий "+" к C++.
  • lucy (13.12.08 21:36) [16]
    Городской Шаман   (13.12.08 21:27) [15]

    Магия дельфи учит вас плохому, юный гакусэй. Не сравнивайте дельфи и С++. Вы поняли бы почему не стоит это делать, если бы сначала изучили С++. К сожалению, большинство приверженцев дельфи не хотят видеть ничего за пределами своего маленького мирка и осознать, что существует не только дельфи и не только С++. Отсюда их фанатизм и дельфицентричность. Почитайте чужой исходный код, и станется вам. Возможно, вы поймете тогда, что используете инструмент не так, как это виделось его создателям и не совсем по назначению.
  • Городской Шаман (13.12.08 22:04) [17]

    > lucy   (13.12.08 21:36) [16]


    А какое назначение у С++? Ходить с косой и распальцовкой что типа крутой ЦЦ-программист, не чета этим ламерам-делфистам?

    Здесь уже об этом уже давно говорили, но снова повторю - "работодателю важна нацеленность на результат, а не на процесс".
  • lucy (13.12.08 22:23) [18]
    Городской Шаман   (13.12.08 22:04) [17]

    >А какое назначение у С++? Ходить с косой и распальцовкой что типа крутой ЦЦ-программист, не чета этим ламерам-делфистам?

    Чтобы вы поняли, о чем речь - C++, как и C - это язык стандартизированный ISO. То есть этот язык, как и C претендует на звание lingua franca. Именно в этом его назначение. Соответственно, сфера его применения предполагает несколько более широкий охват (и можно сказать, что с этим он справляется), нежели чем написание бухгалтерских приложений. Но он может использоваться и для этой цели. Сфера же дельфи, в основном, не выходит за рамки написания упомянутых выше приложений. Причем, в кросплатфоменности и гибкости (если сравнивать, например, по возможностям поддержки ООП), дельфи значительно уступает другим пропиетарным технологиям (таким, как NET или Java). Однако, для написания пользовательского интерфейса для работы с БД она чертовски удобна. Теперь, поняв что к чему, сравните мировоззрение разработчиков той или иной стороны, учтя при этом такую особенность человеческой психики, как стремление мерить все своими мерками. Для того, чтобы приоткрыть завесу над Истиной, достаточно внимательно прочесть [14].
  • Городской Шаман (13.12.08 22:39) [19]

    > lucy   (13.12.08 22:23) [18]


    А можно я сам решу что мне хорошо?
 
Конференция "Прочее" » Замыкания для методов классов в C++. Как?
Есть новые Нет новых   [134446   +39][b:0][p:0.001]