2009-04-16 5 views
1

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

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

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

и

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

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

Edit: Проблема в деталях:

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

ответ

1

Как насчет реализации в 2-х различных способах, как

  • split_with_default_delimiter_space
  • split_with_default_delimiter_delimit

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

4

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

0

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

+0

Я не могу использовать boost здесь, в проекте ... это худшая часть. :( – Shree

1

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

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

Смежные вопросы