У меня есть класс C++ с gajillion (> 100) члены, которые ведут себя почти одинаково:
же типа
в функции, каждый член имеет такой же точный код, сделанный для него, как и другие участники, например присвоение с карты в конструкторе, где ключ карты совпадает с ключом ключа
Эта идентичность поведения повторяется по многим функциям (> 20), конечно, поведение в каждой функции различно, поэтому нет никакого способа фактор вещей.
Список членов очень жидкий, с постоянными дополнениями и иногда удалениями, некоторые (, но не все), управляемые изменением столбцов в таблице БД.
Как вы можете себе представить, это представляет большую боль в-за, насколько создание и поддержания кода, так как для добавления нового элемента, вы должны добавить код к каждой функции , где аналогичные члены являются используемый.
Пример решения я хотел бы
Actual C++ код мне нужно (скажем, в конструкторе):
MyClass::MyClass(SomeMap & map) { // construct an object from a map
intMember1 = map["intMember1"];
intMember2 = map["intMember2"];
... // Up to
intMemberN = map["intMemberN"];
}
C++ код, который я хочу, чтобы иметь возможность написать :
MyClass::MyClass(SomeMap & map) { // construct an object from a map
#FOR_EACH_WORD Label ("intMember1", "intMember2", ... "intMemberN")
$Label = map["$Label"];
#END_FOR_EACH_WORD
}
Требования
Решение должно быть совместимо с GCC (с NMake как сделать систему, если это имеет значение). Не заботьтесь о других компиляторах.
Решение может быть на уровне предварительного процессора или что-то компилируемое. Я в порядке с одним; но до сих пор, все мои исследования указали меня к выводу, что последняя просто из невозможно в C++ (я так мисс Perl теперь, когда я вынужден сделать C++!)
Решение должно быть по крайней мере, в какой-то степени «отраслевой стандарт» (например, Boost отлично, но пользовательский скрипт Perl, созданный Joe-Quick-Fingers однажды и размещенный в его блоге, не является.Черт, я могу легко написать этот скрипт Perl, будучи гораздо более опытным специалистом по Perl, чем C++, - я просто не могу получить большие роли в Software Engineering на моей BigCompany, чтобы купить его используя :))
Решение должен позволить мне объявить список идентификаторов (в идеале, только в одном файле заголовка, а не в каждой директиве «#FOR_EACH_WORD», как это было в приведенном выше примере)
Решение не должно ограничиваться «созданием объекта из таблицы DB "конструктор. Существует много функций, большинство из которых не являются конструкторами, которым это необходимо.
Решение «Сделать все значения в одном векторе, а затем запустить цикл« за »по вектору» является очевидным и не может быть использовано - код в библиотеке, используемой многими приложениями , члены являются общедоступными, и, к сожалению, вопрос о том, что использовать эти приложения для использования членов векселя, а не названных членов, не может быть изменен.
Не потейте языковой разницы. Perl выкопал бы вас из глупости C++, но организация может быть столь же глупой в Perl с такими же плохими результатами. –
В ответ на ваш комментарий к ВОО. Если/когда вы решите реорганизовать этот код, взгляните на библиотеки «boost :: fusion» (возможно, на карте). В случае карты вы присоединяетесь к членам своего объекта, используя: «at_key < member1 > (объект)». Но преимущество в том, что вы можете выполнять итерацию через членов, используя что-то, основанное на «for_each». –
Всем ответчикам/комментаторам - я очень ценю ваш вклад и усилия, как то, что может помочь мне улучшить код/задачу и стать источником отличного обучения. Я попытаюсь просмотреть все предложения и посмотреть, какие из них могут быть применимы, и в этот момент я выберу «принятый» ответ. – DVK