наличие аргументов по умолчанию для переданных ссылок в переполнении стека

У меня есть ряд функций, которые принимают ссылки на typedefD типов данных, как показано ниже:

typedef std::map<string, string> dict;

union ret_t{
int i;
long l;
double d;
};

ret_t func1(char* bytes, dict &d){
//blah blah
}
ret_t func2(char* bytes, dict &d){
//blah blah 2
}

У меня также есть карта функций-обработчиков, использующих boost::function как определено ниже:

std::map <int, boost::function< ret_t (char*, dict) > > handlers;

Я определил это так, чтобы с помощью> 100 функций-обработчиков, которые я использую, я мог просто прочитать ключ и вызвать handlers[key](bytes, d); и чтобы моя функция выполнялась, требуется только 3 if / elses для моих разных типов данных (зная, какой тип данных мне нужен, это еще одна проблема, с которой я не буду сталкиваться. Это не имеет отношения к вопросу). Это работает как ожидалось.

Моя проблема в том, что небольшое количество функций не использует словарь, и было бы полезно в контексте вне обработчиков (например, функция, которая подготавливает поток байтов и преобразует его в long int). Чтобы вызвать эту функцию из контекста, в котором у меня нет предопределенного dict, я должен либо создать бесполезный dict, который никогда не используется:

dict d;
func1(bytes, d);

Или я должен pverride функции:

//previous definition

ret_t func1(char* bytes){
//same blah blah as before
}

Когда я пытаюсь определить его с помощью аргумента по умолчанию, такого как NULL или пустой DICT, я получаю ошибку компилятора:

default argument for 'dict& d' has type 'dict {aka std::map<std::basic_string<char>, std::basic_string<char> >}'

Есть ли способ сделать то, что я хочу, без необходимости полностью переписывать мой код для передачи указателей вместо ссылок?

0

Решение

Для тех функций, которые не используют словарь, создайте две версии. Имейте один, который не принимает словарь в качестве параметра, и тот, который делает, но просто вызывает другой без словаря. Первый используется для всех прямых вызовов, а второй — для отправки, как и другие функции, которые используют словарь.

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector