Я работаю над существующим большим проектом, который в основном:
- Использует граф сцены, где каждый узел имеет дочерние слоты
- Выполняет этап инициализации, на котором каждый узел рекурсивно инициализирует своих дочерних узлов и выполняет некоторые задачи предварительного расчета / очистки для своих собственных элементов данных.
- Затем запускается большое вычисление, доступ к графу сцены осуществляется в чистом режиме только для чтения только из константных функций-членов.
В настоящее время дочерние элементы хранятся с использованием интеллектуальных указателей, в основном, чтобы избежать глубоких копий при построении графа из файла, прочитанного и во время пользовательского редактирования графа.
Поскольку интеллектуальные указатели (std :: shared_ptr) не распространяют константность, у меня есть следующие варианты:
- Храните дочерние элементы, используя интеллектуальные указатели на константные объекты. При рекурсивном выполнении шага инициализации const_cast их в неконстантные указатели. Сохраните дочерние элементы, используя интеллектуальные указатели на константные объекты. Для рекурсивного выполнения шага инициализации const_cast их неконстантным указателям. Я не люблю злоупотреблять const_cast
- Храните дочерние элементы, используя интеллектуальные указатели на константные объекты. При рекурсивном выполнении шага инициализации сделайте глубокую копию каждого дочернего объекта в неконстантный объект, инициализируйте его и замените потомков инициализированным. Это неэффективно, каждый узел глубоко копируется во время инициализации.
- Храните дочерние элементы, используя интеллектуальные указатели на неконстантные объекты. Тогда инициализация больше не проблема, но все константные функции-члены, используемые во время вычислений, могут вызывать неконстантные функции-члены дочерних элементов, что является потенциальным источником ошибок и явно некорректно с константой.
Я знаю, что использование интеллектуальных указателей только для предотвращения глубоких копий во время манипуляции с деревом - не лучший способ реализовать это в эпоху С ++ 11 и переместить семантику. Когда-нибудь можно будет переписать весь код с семантикой перемещения, но это довольно большая работа.
Каким был бы, по вашему мнению, лучший способ реализовать этот шаблон, не переписывая все с помощью семантики перемещения? Я подумал об упаковке std :: shared_ptr для распространения константности, есть ли другие идеи?
Спасибо!
const
функциях-членах ( и не предоставлять неконстантный доступ к этому объекту вconst
функциях-членах). - person dyp   schedule 05.10.2014