Вы можете просто сделать рефакторинг таким образом, чтобы у вас вообще не было вложенной структуры. Добавьте сеттер, а не распаковывает цвет в его составные части, чтобы существующий код не сильно изменился, и переходите оттуда.
Вы также можете взять необязательный второй указатель, который копается во вложенный тип. Один тест, чтобы увидеть, нужен ли вам второй параметр, может оказаться достаточно хорошим по сравнению с вашим текущим методом, и его будет легче расширить, если позже появятся дополнительные поля.
Сделайте еще один шаг, и у вас есть базовый класс MaterialPointer
с виртуальным методом Dereference
. Класс case может обрабатывать простые члены, а производные классы обрабатывают вложенные члены с любой дополнительной информацией, необходимой для их поиска. Затем фабрика может производить MaterialMember*
объектов соответствующего типа. Конечно, теперь вы застряли с распределением кучи, так что это, вероятно, слишком далеко, чтобы быть практичным.