У меня есть ряд функций, которые принимают ссылки на typedef
D типов данных, как показано ниже:
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> >}'
Есть ли способ сделать то, что я хочу, без необходимости полностью переписывать мой код для передачи указателей вместо ссылок?
Для тех функций, которые не используют словарь, создайте две версии. Имейте один, который не принимает словарь в качестве параметра, и тот, который делает, но просто вызывает другой без словаря. Первый используется для всех прямых вызовов, а второй — для отправки, как и другие функции, которые используют словарь.
Других решений пока нет …