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 ответ
Аргумент шаблона для std::function
фактический тип функции. void()
означает функцию, которая не принимает аргументов и не возвращает значения.
Если вы хотите сохранить функцию, которая возвращает значение, вы должны создать новый объект функции. Или, если вы не уверены, что функция вернет что-то, используйте boost.optional.