Хранение функций boost::bind в std::map

Я создаю кучу функций, которые эффективно делают одно и то же:

long Foo::check(long retValue, unsigned toCheck, const std::set<unsigned>& s)
{
    auto it = s.find(toCheck);
    return (it == s.end()) ? -retValue : retValue;
}

где Foo — класс. Пока все достаточно просто. Теперь я фактически хочу создать множество вариантов этого, но привязанных к разным наборам. Затем я хочу сохранить их в std::map. Итак, используя boost::bind и boost::function, сделайте что-то вроде:

void Foo::addToMap(unsigned option, const std::set<unsigned>& currentSet)
{
    someMap[option] = boost::bind(&Foo::check, this, _1, _2, currentSet);
}

Проблема, с которой я сталкиваюсь, - это попытка определить тип карты. Я думал, что это будет:

std::map<unsigned, boost::function<long (long, unsigned)> > someMap;

Но компиляция этого с помощью MSVC 9.0 дает: error C2582: 'operator =' function is unavailable in 'boost::function<Signature>'.

Каким именно должен быть второй аргумент шаблона для отображения?


person Yuushi    schedule 29.03.2012    source источник
comment
Вы пытались обернуть заданный аргумент (для привязки) в boost:: ref или как он там называется? ссылки не назначаются.   -  person Cheers and hth. - Alf    schedule 29.03.2012
comment
@Cheersandhth.-Alf Пробовал обернуть его с помощью boost::cref(currentSet), но это дает ту же ошибку. То же самое, если я передам его неконстантным значением, то же самое, если я передам его неконстантным значением...   -  person Yuushi    schedule 29.03.2012
comment
о, черт. тогда попробуйте воспроизвести проблему в минимальной программе и опубликуйте ее (полный код).   -  person Cheers and hth. - Alf    schedule 29.03.2012
comment
@Cheersandhth.-Альф Спасибо. Вы косвенно помогли мне решить эту проблему, поскольку, создав минимальную программу, я понял, что не включаю нужные файлы заголовков.   -  person Yuushi    schedule 29.03.2012


Ответы (2)


Используя boost 1.49 и g++ 4.4.4, я смог сделать что-то очень похожее. Вот фрагмент кода.

typedef boost::function< void (SomeType) > CallbackType;

std::pair<std::string, CallbackType> NameCallbackPair;

Затем я смог назначить его следующим образом:

NameCallbackPair somePair(someString, boost::bind(&SomeClass::someMethod, this, _1));

Может быть, это что-то с MSVC9.

person Lou    schedule 29.03.2012

Ах, я решил это. Я включил неправильный заголовочный файл; вместо:

#include <boost/function.hpp>

Я включал вещи из папки boost/function, например:

#include <boost/function/function_fwd.hpp>

person Yuushi    schedule 29.03.2012