Делегировать на C ++ 11

Предоставляет ли C ++ 11 делегатов?

Если нет, то какой лучший (самый эффективный) способ сделать что-то подобное на C ++? Boost.Signals? FastDelegate? Что-то другое?

Вы можете получить семантику, подобную делегату, используя bind для привязки функции-члена к экземпляру classа:

 #include  struct C { void Foo(int) { } }; void Bar(std::function func) { func(42); // calls obj.Foo(42) } int main() { using namespace std::placeholders; C obj; Bar(std::bind(&C::Foo, obj, _1)); } 

В этом примере Bar() принимает все, что имеет единственный параметр int и возвращает void .

В main() мы привязываем указатель на функцию-член C::Foo экземпляру C именем obj . Это дает нам объект, который можно вызывать с одним параметром int и который возвращает void .

Мы вызываем Bar() с этим объектом, и Bar() делает вызов obj.Foo(42) .

Вам не нужен c ++ 0x. в вас есть bind1st bind2nd mem_fun и mem_fun_ref . У вас также есть Boost.Bind, который обобщает все вышеперечисленные функции (IIRC).

Из памяти …

 vector foo = makeVector(); vector foop = makeVectorP(); vector bar1,bar2,bar3,bar4; transform( foo.begin(), foo.end(), back_inserter( bar1 ), mem_fun_ref(&Foo::getBar) ); transform( foop.begin(), foop.end(), back_inserter( bar2 ), mem_fun(&Foo::getBar) ); transform( foo.begin(), foo.end(), back_inserter( bar3 ), bind1st(&bar_from_foo) ); transform( foo.begin(), foo.end(), back_inserter( bar4 ), boost::bind(&bar_from_foo, _1) ); 

Хотя std::function работает хорошо, я хотел бы указать на этот замечательный fragment кода делегата, написанный здесь (включая пример использования!). Следуя рекомендациям и ответам, вы можете прочитать все о том, как этот class Delegate построен и почему он может быть быстрее, чем std::function .

Обратите внимание также на мой вопрос здесь о проблеме, с которой я столкнулся с ней на VS 2015.

Вам не обязательно ждать C ++ 0x. Вы можете реализовать делегатов почти так же в текущем стандарте C ++ 03. Вам просто нужно перегрузить оператор (), чтобы вы могли вызвать MyObjectFunctor functor; functor(); MyObjectFunctor functor; functor(); и поскольку функтор является объектом, вы можете передать его как делегат / объект в функции;

текущая версия STL определяет заголовок который предоставляет функции, готовые для использования с Functors / Lambdas / Delegates.

простой пример функтора.

 struct FunctorDelegate { // as so to delegate as a function that takes an int input void operator()(int) { // do what I want } }; int main() { //... do some stuffs with an std::vector aRange; FunctorDelegate functor; std::for_each(aRange.begin(), arange.end(), functor); } 

Механизм C всегда был указателем функции и baton (за исключением qsort () и bsearch (), которые не использовали дубинку).

Таким образом, всегда можно передать объект classа в качестве дубинки.

НАПРИМЕР:

 class tp { public: tp() { n = 0; } void m(int z) { printf("%d is %d\n", n++, z++); } int n; }; void higher_func(int *opx, int cnt, void *handler(int itm, void *baton), void *baton) { for (int i = 0; i < cnt; i++) handler(opx[itm], baton); } /* You would need to provide this stub -- potentially templateable */ void translate_baton(int itm, void *baton) { ((tp *)baton)->m(itm); } /* used like so: */ int main() { int array[7]; //... tp cx; higher_func(array, 7, translate_baton, &cx); }