Теперь я пытаюсь использовать boost bind & mem_fn
.Но есть проблема связать перегруженную функцию.Как устранить ошибку компиляции следующих кодов?
boost::function< void( IF_MAP::iterator ) > bmf = std::mem_fun1< void, IF_MAP, IF_MAP::iterator >( &IF_MAP::erase );
boost::function< void( IF_MAP::iterator ) > bmf = boost::mem_fn< void, IF_MAP, IF_MAP::iterator >( &IF_MAP::erase );
Основная цель - компилировать следующие коды
IF_MAP M;
boost::function< void( IF_MAP::iterator ) > bmf = boost::bind(
boost::mem_fn< void, IF_MAP, IF_MAP::iterator >( &IF_MAP::erase ),
&M, _1 );
M.insert( IF_MAP::value_type( 1, 1.f ) ); M.insert( IF_MAP::value_type( 2, 2.f ) );
bmf( 2 );
Сообщения об ошибках компиляции выглядят следующим образом ...
ошибка C2665: 'boost :: mem_fn': ни одна из двух перегрузок не может преобразовать все типы аргументов: 'boost :: _ mfi :: mf1 boost :: mem_fn :: iterator> (R (__thiscall std ::map <_Kty, _Ty> :: *) (A1)) 'или' boost :: _ mfi :: cmf1 boost :: mem_fn :: iterator> (R (__thiscall std :: map <_Kty, _Ty> :: *) (A1) const) '
PS Как вы знаете, std :: map имеет 3 перегруженных функции стирания члена
void erase(iterator _Where)
size_type erase(const key_type& _Keyval)
void erase(iterator _First, iterator _Last)
2-ю функцию можно легко связать, но другие нет.
Редактировать
Чтобы описать мой вопрос более подробно:
На самом деле, я хочу сделать отложенный вызов функции.Когда я встречаю код возврата функции, тогда пришло время выйти за рамки, так что должна быть вызвана отложенная функция.
Теперь я выполняю рефакторинг некоторых устаревших кодов.В настоящее время я обычно вижу такой шаблон кодов.(Фактические коды более сложные, но почти такие же, как показано ниже) Дублированные erase()
вызовы разбросаны в этой функции.
typedef map< int, float > IF_MAP;
bool DoAndPopOld( IF_MAP& M, int K )
{
IF_MAP::iterator Itr = M.find( K );
if ( Itr == M.end() ) return false;
if ( K < 10 )
{
M.erase( Itr ); // erase call is here...
return false;
}
if ( 100 < K )
{
// Do something
M.erase( Itr ); // and here...
return true;
}
// Do something
M.erase( Itr ); // and also here!
return true;
}
Итак, я хочу рефакторинг приведенного выше кода, как этот ...
class ScopedOutCaller
{
private:
boost::function< void() > F;
public:
ScopedOutCaller( boost::function< void() > _F ) : F(_F) {}
~ScopedOutCaller() { F(); } // deferred function call
};
bool DoAndPopNew( IF_MAP& M, int K )
{
IF_MAP::iterator Itr = M.find( K );
if ( Itr == M.end() ) return false;
// Make deferred call, so I do not consider calling erase function anymore.
ScopedOutCaller SOC( boost::bind( &IF_MAP::erase ), &M, Itr );
if ( K < 10 )
{
// M.erase( Itr ); <-- unnecessary
return false;
}
if ( 100 < K )
{
// Do something
// M.erase( Itr ); <-- unnecessary
return true;
}
// Do something
// M.erase( Itr ); <-- unnecessary
return true;
}
Но, как я и просил ... происходят ошибки компиляции.Суть в том, что я хочу сделать, это как отложить вызов функции.Пожалуйста, скажите мне, как сделать отложенный звонок.Спасибо.