Теперь я пытаюсь использовать boost bind & mem_fn
. Но проблема связана с перегруженной функцией. Как разрешить ошибку компиляции следующих кодов?не может преобразовать параметр 1 из «перегруженной функции» в «...»
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: 'повышение :: mem_fn': ни одно из 2 перегрузки могут преобразовывать все типы аргументов. может быть «boost :: _ mfi :: mf1 boost :: mem_fn :: iterator> (R (__thiscall std :: map < _Kty, _Ty> :: *) (A1)) ' или 'boost :: _ mfi :: cmf1 boost :: mem_fn :: итератор> (R (__thiscall станд :: Карта < _Kty, _Ty> :: *) (A1) Const)»
P.S. Как U известно, станд :: карта имеет 3 перегруженная функция стирания
void erase(iterator _Where)
size_type erase(const key_type& _Keyval)
void erase(iterator _First, iterator _Last)
вторая функция может быть переплетены легко, а другие нет.
Редактировать
Чтобы описать свой вопрос более подробно:
На самом деле, я хочу, чтобы сделать вызов функции отложенной. Когда я встречаю код возврата с функцией, тогда пришло время всплывать, поэтому должна быть вызвана отложенная функция.
Теперь я пересматриваю некоторые устаревшие коды. В настоящее время я обычно вижу такой шаблон кода. (Фактические коды более сложные, но почти такие же, как указано ниже) В этой функции разбросаны звонки дубликатов 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;
}
Но, как я просил ... компилировать ошибки произошли. Долгий и короткий, что я хочу сделать, - как отсрочить вызов функции. Пожалуйста, скажите мне, как сделать отложенный вызов. Спасибо.
Я переместил информацию от своего "ответа" на вопрос, где это должно быть. Если у вас есть дополнительная информация, отредактируйте ее в вопросе. Если вы опубликуете его как ответ, это просто смущает (и, что более важно, люди не будут видеть, если до ответа) – jalf
Ну, вы только заботитесь о VC или нет? –
@George Я обычно использую MSVS, но если у вас есть какая-то идея, расскажите мне что-нибудь. Благодарю. – codevania