У меня есть структура данных C++, которая является необходимой «блокнотной» для других вычислений. Это не долговечно, и это не часто используется, поэтому производительность не критична. Тем не менее, он включает генератор случайных чисел среди других обновляемых полей отслеживания, и, хотя фактическое значение генератора не имеет значения, является важным, чтобы значение обновлялось, а не копировалось и использовалось повторно. Это означает, что в общем случае объекты этого класса передаются по ссылке.Работа с ограничениями на C++ для неконстантных ссылок на временные ресурсы
Если экземпляр нужен только один раз, наиболее естественным подходом является построение их по мере необходимости (возможно, с использованием фабричного метода или конструктора), а затем передача блокнота в метод потребления. Подписи методов потребителей используют проход по ссылке, поскольку они не знают, что это единственное применение, но заводские методы и конструкторы возвращаются по значению - и вы не можете передавать неназванные временные ссылки по ссылке.
Есть ли способ избежать засорения кода с неприятными временными переменными? Я хотел бы избежать таких вещей, как следующее:
scratchpad_t<typeX<typeY,potentially::messy>, typename T> useless_temp = factory(rng_parm);
xyz.initialize_computation(useless_temp);
Я мог бы сделать блокнотный внутренне mutable
и просто маркировать все параметры const &
, но это не кажется мне лучшей практика, так как это вводит в заблуждении, и я могу Я делаю это для классов, которые я не полностью контролирую. Передача по ссылке rvalue потребует добавления перегрузок для всех пользователей блокнота, который поражает цель - иметь четкий и сжатый код.
Учитывая тот факт, что производительность не является критичной (но размер кода и читаемость), Каков наилучший подход к передаче в таком блокноте? Использование функций C++ 0x в порядке, если требуется, но предпочтительно C++ 03-только функции должны быть достаточными.
Edit: Чтобы было ясно, используя временный выполнимо, это просто несчастный беспорядок в коде, я хотел бы избежать. Если вы никогда не даете временное имя, оно явно используется только один раз, и чем меньше строк кода читается, тем лучше. Кроме того, в инициализаторах конструкторов невозможно объявить временные.
Можете ли вы взять «блокнот» по значению вместо ссылки? Таким образом, это может быть временным и изменчивым. –
Выполнение этого подразумевает создание копии - штраф в вышеприведенном случае, где временная переменная бесполезна, но не очень хорошо, когда мне действительно нужно повторно использовать переменную; это означало бы повторение rng с тем же состоянием, плохая идея. –
@ Eamon Nerbonne: Потенциально, только концептуально. В оптимизированных сборках во многих компиляторах параметр будет создан «на месте». –