У меня есть четыре варианта, три из которых уже были названы другими:
Пройдите заводской маршрут, как предложили несколько других здесь. Одним из недостатков этого является то, что у вас не может быть последовательного именования из-за перегрузки (иначе у вас возникнет та же проблема), так что это внешне менее чисто. Другой, более крупный недостаток заключается в том, что он исключает возможность размещения непосредственно в стеке. Все будет распределено в куче, если вы воспользуетесь этим подходом.
Пользовательские обертки объектов. Это хороший подход, и я бы порекомендовал его, если вы начинаете с нуля. Если у вас много кода с использованием, например, значков в качестве строк, то переписывание кода может сделать этот параметр нежизнеспособным.
Добавьте перечисление к методу, определяющее, как обрабатывать строку. Это работает, но требует, чтобы вы переписали все существующие вызовы, чтобы включить новое перечисление (хотя при желании вы можете указать значение по умолчанию, чтобы избежать этого).
Добавить фиктивный параметр, который не используется, чтобы различать две перегрузки. например Прикрепите bool
к методу. Этот подход используется стандартной библиотекой в нескольких местах, например std::nothrow
является фиктивным параметром для operator new
. Недостатки этого подхода в том, что он уродлив и не масштабируется.
Если у вас уже есть большая база существующего кода, я бы рекомендовал либо добавить перечисление (возможно, со значением по умолчанию), либо добавить фиктивный параметр. Ни то, ни другое не красиво, но оба довольно просты в модернизации.
Если вы начинаете с нуля или у вас мало кода, я бы порекомендовал пользовательские оболочки объектов.
Методы фабрики могут быть полезны, если у вас есть код, который интенсивно использует необработанные строки badge
/ logonName
, но не использует класс Person
.