Какой элегантный метод обратного вызова метода следует использовать? - PullRequest
4 голосов
/ 04 мая 2010

Я удивлен, что этот вопрос раньше не задавался на SO (ну, по крайней мере, я не смог его найти).

Вы когда-нибудь проектировали шаблон обратного вызова метода (что-то вроде "указателя" на метод класса) в C ++ и, если да, как вы это делали?

Я знаю, что метод - это обычная функция с некоторым скрытым параметром this, который служит контекстом , и я имею в виду довольно простой дизайн. Однако, поскольку вещи часто являются более сложными, чем кажется, мне интересно, как наш C ++ гуру реализовал бы это, предпочтительно элегантно и стандартным способом.

Все предложения приветствуются!

Ответы [ 3 ]

9 голосов
/ 04 мая 2010

boost :: function для одиночного обратного вызова, boost :: signal или boost :: сигналы2 , когда можно зарегистрировать несколько обратных вызовов, используя boost :: bind для привязки методов-членов (или адаптации сигнатур различными способами).

Если у вас есть доступ к компилятору с поддержкой C ++ 0x / C ++ 11, он может иметь std :: function и std :: bind, которые являются новой стандартной версией boost :: function и boost :: bind

2 голосов
/ 04 мая 2010

Хорошее введение в обратные вызовы с C ++ вы можете найти здесь . Я использовал эту статью в качестве основы для реализации, когда повышение было невозможно.

2 голосов
/ 04 мая 2010

Не достаточно ли boost::function (в сочетании с boost::bind) достаточно элегантно? Это также избавит вас от неприятных (но соответствующих стандартам) деталей реализации, таких как указатели на элементы, размер которых превышает void*, что было проблемой в библиотеке обратных вызовов для старой системы Windows CE. Я бы предпочел использовать хорошо известную библиотеку, чем самостоятельно решать эти проблемы.

...