std :: bind функция-член с указателем на объект - PullRequest
3 голосов
/ 23 ноября 2010

У меня есть класс с функциями-членами:

typedef std::function<bool (const std::string &)> InsertFunction;    

bool insertSourceFile( const std::string & );
bool insertSourceDir( const std::string & );
bool insertHeaderFile( const std::string & );
bool insertHeaderDir( const std::string & );

Я хотел бы иметь ссылку на один из этих InsertFunction в другом классе и использовать его для выполнения своей работы (без необходимости создавать классы для каждой из этих функций). Я попытался использовать конструктор класса и std::bind, чтобы связать неявный первый аргумент функции-члена с указателем рассматриваемого объекта:

new ListParser( p_target->sourceDirs(), bind(&Target::insertSourceFile, p_target, _1), this );

с

ListParser::ListParser( const stringSet &dirs, const InsertFunction &insert,
                        State* parent = 0 )
:   ParserState( parent ),
    m_dirs( dirs ),
    m_insert( insert )
{    }

ОБНОВЛЕНИЕ : благодаря @lijie, источник теперь компилируется, но когда вызывается функция m_insert, std::exception выбрасывается для std::bad_function_call. Что может быть не так? Спасибо! Если вам нужна дополнительная информация, пожалуйста, спросите!

1 Ответ

2 голосов
/ 23 ноября 2010

В вашем коде insertSourceFile - это метод , который возвращает std::function<etc>. При вызове bind вы делаете Target::insertSourceFile(), который вызывает метод. Отсюда и ошибка.

EDIT В частности, Target :: insertSourceFile не является функцией, которая принимает строку и возвращает логическое значение.

Я думаю, что вы ищете в Target, вы заявляете bool insertSourceFile(const std::string &); и т. Д., А затем вы делаете std::bind(&Target::insertSourceFile, p_target, _1) но это предположение, пока намерение не выяснено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...