пятница, 4 апреля 2008 г.

Сегодня выяснилось что C# не содержит чего-либо похожего на boost::bind (о ужас, даже на bind1st bind2nd). Врапперы для функций нужно писать ручками. Нашел статью в Dr. Dobb's на эту тему, в общем совсем он примитивный этот C#, бейсик со скобками =) Update... вот небольшой пример на С++, здесь функция fn - принимающая один параметр типа int, используется как callback - без аргументов, при вызове callback в fn всегда будет передаваться 1.
void fn (int value) {...}

boost::function<void ()> delegate_type;

delegate_type callback = boost::bind( &fn, 1 );
    
callback();//<---- реально происходит вызов fn(1);
с делегатами в C# такое сделать нельзя :)

9 комментариев:

  1. Но в шарпе ведь есть обычный лямбды - зачем байнды? ;)

    ОтветитьУдалить
  2. > с делегатами в C# такое сделать нельзя :)

    ну это не совсем так ;)

    void fn(int value) {....}
    delegate void Test(); // это typedef boost::function<void()> Test;
    void TestBind()
    {
    Test d = delegate() { fn(1); };
    d(); //вызовется fn(1)
    }

    я думаю не нужно объяснять насколько это лучше и проще и гибче бустового бинда :)

    ОтветитьУдалить
  3. ЗЫ. любители краткости могут ещё и так:
    Test d = () => fn(1);

    ОтветитьУдалить
  4. Не очень понял чем проще, ведь нужно написать функцию враппер, а с биндом ее писать не нужно, при этом функционал тот-же :)

    ОтветитьУдалить
  5. 1) вменяемые сообщения компилятора при ошибке (а то МСовский компилер вообще падать любит в таких случаях).
    2) написание враппера сводится просто к написанию вызова оригинальной ф-ции, как в () => fn(1), зато сравните шарповый
    (int a, int b) => fn(a, 13, b)
    против
    boost::bind( &fn, _1, 13, _2);
    Шарповый вариант чище и красивее, нет?

    А теперь попробуйте в плюсах написать, ну, хотя бы, аналог
    (int a) => fn(a*2, fn2(a));
    вот как раз в плюсах и придётся писать отдельный уродливый враппер...

    Вообще, насчёт примитивности шарпа (последней версии) вы мягко говоря неправы, есть там куча прикольных заморочек которых ну очень не хватает плюсам :)
    ИМО, единственные вещи которых не хватает шарпу и вообще .НЕТу, это deterministic destruction и const и volatile. Вот когда они их наконец реализуют, будет вообще прикольно :)

    ОтветитьУдалить
  6. 1) вменяемые сообщения компилятора при ошибке (а то МСовский компилер вообще падать любит в таких случаях).
    2) написание враппера сводится просто к написанию вызова оригинальной ф-ции, как в () => fn(1), зато сравните шарповый
    (int a, int b) => fn(a, 13, b)
    против
    boost::bind( &fn, _1, 13, _2);
    Шарповый вариант чище и красивее, нет?

    А теперь попробуйте в плюсах написать, ну, хотя бы, аналог
    (int a) => fn(a*2, fn2(a));
    вот как раз в плюсах и придётся писать отдельный уродливый враппер...

    Вообще, насчёт примитивности шарпа (последней версии) вы мягко говоря неправы, есть там куча прикольных заморочек которых ну очень не хватает плюсам :)
    ИМО, единственные вещи которых не хватает шарпу и вообще .НЕТу, это deterministic destruction и const и volatile. Вот когда они их наконец реализуют, будет вообще прикольно :)

    ОтветитьУдалить