2012-02-07 2 views
1

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

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

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. Вышеуказанный метод создает проблему при попытке привязки к функции, которая возвращает что-то. Как получить возвращаемое значение? (В моей глупости я устал бросать объекты функции без особого успеха)

ответ

0

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

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

+0

Я знаю, что это фактический тип функции. Если я использую bind, вызов функции будет работать, и он вызовет мою функцию с аргументами, хотя m_f имеет тип «void()». Я не могу использовать boost, я должен придерживаться TR1. Я хочу избежать создания нового объекта функции, если это возможно. – celavek

Смежные вопросы