void fn (int value) {...} boost::function<void ()> delegate_type; delegate_type callback = boost::bind( &fn, 1 ); callback();//<---- реально происходит вызов fn(1);с делегатами в C# такое сделать нельзя :)
пятница, 4 апреля 2008 г.
Сегодня выяснилось что C# не содержит чего-либо похожего на boost::bind (о ужас, даже на bind1st bind2nd). Врапперы для функций нужно писать ручками.
Нашел статью в Dr. Dobb's на эту тему, в общем совсем он примитивный этот C#, бейсик со скобками =)
Update...
вот небольшой пример на С++, здесь функция fn - принимающая один параметр типа int, используется как callback - без аргументов, при вызове callback в fn всегда будет передаваться 1.
Подписаться на:
Комментарии к сообщению (Atom)
9 комментариев:
А делегаты?
обновил пост
Но в шарпе ведь есть обычный лямбды - зачем байнды? ;)
> с делегатами в C# такое сделать нельзя :)
ну это не совсем так ;)
void fn(int value) {....}
delegate void Test(); // это typedef boost::function<void()> Test;
void TestBind()
{
Test d = delegate() { fn(1); };
d(); //вызовется fn(1)
}
я думаю не нужно объяснять насколько это лучше и проще и гибче бустового бинда :)
ЗЫ. любители краткости могут ещё и так:
Test d = () => fn(1);
Не очень понял чем проще, ведь нужно написать функцию враппер, а с биндом ее писать не нужно, при этом функционал тот-же :)
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. Вот когда они их наконец реализуют, будет вообще прикольно :)
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. Вот когда они их наконец реализуют, будет вообще прикольно :)
А делегаты?
Отправить комментарий