Я не знаю, что вы пытаетесь сделать, но шаблоны параметризованы по типу. Обычная функция или объект функции должны делать то, что вы хотите.
Итак, давайте сделаем вашу функцию такой:
void calculate(const string &key, multimap<string, double>& myMap)
{
// do something...
}
теперь мы можем использовать связующие STL и ptr_fun
, чтобы преобразовать вашу функцию в объект и связать ее второй аргумент с вашей картой.
multimap<string, double> map1;
vector<string> v = getValuesForMyVector();
for_each(v.begin(), v.end(), bind2nd(ptr_fun(calculate), map1);
Итак, ptr_fun(calculate)
преобразует calculate
, который является указателем на функцию, в специальный класс, называемый pointer_to_binary_function<string, multimap<string, double>, void>
, для которого определена operator()
для вызова вашей функции, то есть требуется 2 параметры.
bind2nd(ptr_fun(calculate), map1)
возвращает binder2nd<string, void>
, для которого все еще определено operator()
, но теперь он принимает только 1 параметр. Второй параметр привязан к map1. Это позволяет for_each
работать с этим функциональным объектом.
Конечно, вы застряли, используя эти 2 адаптера, если выполняете функцию. Лучше сделать класс:
class MapCalculator
{
public:
MapCalculator(multimap<string, double>& destination) : map_(destination) {}
void operator()(const string& s)
{
// do something...
}
private:
multimap<string, double>& map_;
};
// later...
multimap<string, double> map1;
vector<string> v = getValuesForMyVector();
for_each(v.begin(), v.end(), MapCalculator(map1));