Перегрузка метода на аргументы по умолчанию - PullRequest
1 голос
/ 16 апреля 2009

Возможно ли перегрузить метод на параметры по умолчанию?

Например, если у меня есть метод split () для разделения строки, но в строке есть два разделителя, скажем '_' и "delimit". Могу ли я иметь два метода что-то вроде:

split(const char *str, char delim = ' ')

и

split(const char *str, const char* delim = "delimit");

Или есть лучший способ добиться этого? Почему-то мой мозг сейчас не работает и не может придумать другого решения.

Редактировать: Проблема в деталях:

У меня есть строка с двумя разделителями, например, nativeProbableCause_Complete | Alarm | Text. Мне нужно разделить nativeProbableCause и Complete | Alarm | Text, а затем, далее, мне нужно разделить Complete | Alarm | Text на отдельные слова и через некоторое время объединить их с пробелом в качестве разделителя (для которого я уже написал утилиту и нет большое дело). Меня беспокоит только разделение строки с разделителями.

Ответы [ 4 ]

4 голосов
/ 16 апреля 2009

Нет, вы не можете - если вы думаете об этом, понятие по умолчанию означает «используйте это, если я не скажу иначе». Если у компилятора есть 2 варианта по умолчанию, какой из них он выберет?

1 голос
/ 16 апреля 2009

Почему бы просто не вызвать split () дважды и явно пропустить разделитель во второй раз? Всегда ли разделители будут одиночными символами?

Выполняете ли вы какую-либо другую обработку второго набора слов перед тем, как присоединиться к ним? Если нет, то для второй задачи вы действительно хотите заменить подстроки. Это проще всего сделать с помощью std :: string :: find и std :: string :: replace. Если вам нужно использовать c-строки, вы можете использовать strstr / strchr / strpbrk, strcpy и strcat или просто использовать strstr / strchr / strpbrk и соединить их на месте.

1 голос
/ 16 апреля 2009

Как насчет реализации как 2 различных метода, таких как

  • split_with_default_delimiter_space
  • split_with_default_delimiter_delimit

Лично я предпочел бы использовать что-то вроде этого (более читабельное ... передача намерений) по сравнению с типом перегрузки, который вы упомянули ... даже если бы компилятор мог как-то это сделать.

0 голосов
/ 16 апреля 2009

Вы можете использовать версию split, которая принимает переменное количество разделителей (split(const char*,vector<string>), если вы хотите split(const char*, const char**)) или просто использовать Boost Tokenizer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...