std :: tr1 :: назначение и привязка функции - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь узнать, как наилучшим образом использовать функции std :: function и std :: bind в стандартной библиотеке - меня интересуют версии TR1, поскольку это то, что у меня есть на данный момент, и я 'я не знаю различий, если таковые имеются, между реализациями TR1 и реализациями C ++ 11.

Поэтому для упражнения я настроил создание простого, скажем, «диспетчера».Я хочу иметь возможность выполнять любую функцию от диспетчера на основе некоторых решений, принятых позже во время выполнения.Я установил в своем классе элемент данных общей функции, например, так:

class PoorDispatcher
{
 ...
 private:
     std::tr1::function<void()> m_f;
}

Затем я назначаю элементу данных функцию, которую я действительно хочу вызвать, аналогично приведенному ниже

...
m_f = std::tr1::bind(some_func, param1, param2, param3);
...
// then the call
m_f(); // SUCCESS

Вышеуказанное позволяет мне успешно вызвать нужную функцию, но я не уверен, что это правильно.Вопросы:

  1. Является ли приведенный выше сценарий использования "нормальным"?Есть ли лучшие альтернативы?
  2. Приведенный выше метод создает проблему при попытке привязки к функции, которая возвращает что-то.Как я могу получить возвращаемое значение?(Из-за своей глупости я устала разыгрывать функциональные объекты без особого успеха)

1 Ответ

0 голосов
/ 07 февраля 2012

Аргумент шаблона для std::function является фактическим типом функции. void() означает функцию, которая не принимает аргументов и не возвращает значения.

Если вы хотите сохранить функцию, которая возвращает значение, вы должны создать новый объект функции. Или, если вы не уверены, что функция вернет что-то, используйте boost.optional .

...