std::tr1:: назначение и привязка функции

Я пытаюсь узнать, как наилучшим образом использовать функции 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 ответ

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

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

Другие вопросы по тегам