пятница, 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 комментариев:

CobaltD комментирует...

А делегаты?

Unknown комментирует...

обновил пост

Анонимный комментирует...

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

Artem комментирует...

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

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

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

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

Artem комментирует...

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

Unknown комментирует...

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

Artem комментирует...

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. Вот когда они их наконец реализуют, будет вообще прикольно :)

Artem комментирует...

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. Вот когда они их наконец реализуют, будет вообще прикольно :)

CobaltD комментирует...

А делегаты?