функция повышения с дополнительными параметрами

У меня есть карта, содержащая boost::function значения, как определено ниже:

std::map <std::string, boost::function<std::string (std::string, int)> > handlers;

Допустим, я определил следующую функцию:

using namespace std;
string substring (string input, int index = 0){
if (index <= 0){
return input;
}
stringstream ss;
for (int j = index; j<input.length(); j++){
ss << input[j];
}

return ss.str();
}

Я хотел бы иметь возможность сохранить это в карте обработчиков, но с это необязательный параметр. У Boost есть способ выполнить это? Я смотрел на boost::optional, но это не похоже на то, что я хочу.

РЕДАКТИРОВАТЬ

Чтобы дать немного больше информации, есть несколько обработчиков, которые требуют дополнительных аргументов, таких как указатель на словарь (typedef std::map < std::string, std::string > dictionary) или что-то, потому что они вносят изменения в этот словарь. Тем не менее, большинство обработчиков не касаются рассматриваемого словаря, но, чтобы сохранить их все на одной карте, все они должны принимать одинаковые аргументы (иметь один и тот же шаблон для boost::function). Цель состоит в том, чтобы сделать функции, которые вообще не работают со словарем, пригодными для использования без необходимости: а) создания словаря с единственной целью его передачи и неиспользования, или б) точного копирования кода в другую функцию, которая не не требует этот аргумент.

Приведенный выше код является упрощенным примером того, что я делаю.

2

Решение

Краткий ответ: это невозможно в C ++ без большого количества дополнительного кода.

Длинный ответ:
Значения по умолчанию для аргументов функции в C ++ используются только тогда, когда они необходимы в контексте, где функция название появляется. Если вы вызываете функцию с помощью других средств (например, указатель на функцию или boost::function/std::functionинформация о возможных аргументах по умолчанию недоступна компилятору, поэтому он не может их заполнить.

В качестве фона, вот как аргументы по умолчанию работают в C ++:
Когда у вас есть выражение substring(MyString)std::string MyString = "something"), то компилятор ищет все функции, вызываемые substring и находит string substring(string, int=0), Эта функция принимает два параметра, один из которых может иметь значение по умолчанию, что делает функцию жизнеспособной. Чтобы фактически вызвать функцию, компилятор изменяет исходный код так, чтобы он читал substring(MyString, 0) и приступает к генерации кода на основе этой адаптации.

Чтобы можно было использовать значения по умолчанию с косвенным вызовом, например, через boost::functionвы фактически должны эмулировать механизм аргументов по умолчанию компилятора.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]