Использование внешней структуры данных для хранения изменяемых объектов:
struct A
{
static C[const(A)*] _c1s, _c2s;
void compute(ref const(R) r) const
{
_c1s[&this] = ...
_c2s[&this] = ...
}
}
Я использую &this
в качестве ключа для внешней хеш-таблицы, но вам, вероятно, будет лучше использовать какой-то уникальный идентификатор. Это очень уродливое и хитрое решение. Мне это не нравится Также обратите внимание, что хеш-таблицы являются локальными для потоков, поэтому один и тот же объект будет иметь разные значения в разных потоках. Это может или не может быть желательным для вашего конкретного применения.
Переосмыслите, как вы используете const
в D.
В D const
является транзитивным и побитовым, то есть логическая константа не поддерживается. Цель этого состоит в том, чтобы гарантировать одновременную совместную запись данных. Даже если ваш код может быть логически постоянным правильным, он все равно прервется, если два потока попытались вызвать compute
для одного и того же объекта, поэтому D запрещает его и не обеспечивает законного выхода (нет mutable
).
По сути, вы должны помечать функции как const
только тогда, когда они поразрядно постоянны .
В результате вы должны использовать const
в D намного меньше, чем в C ++, потому что вам требуется побитовое const намного меньше, чем логическое.
В качестве примера рассмотрим простую (бессмысленную) обобщенную функцию equal
, которая сообщает, равны ли два объекта:
bool equal(T)(T lhs, T rhs) { return lhs == rhs; }
Обратите внимание, что я не пометил параметры функции как const
. Это специально. Тестирование на равенство не должно требовать побитового const - оно требует только логического const, поэтому принудительное использование уровня const для D будет бесполезным ограничением.
Как говорит jA_cOp, сообщество D не видит места для логического констант в D, к лучшему или к худшему. Проблема возникает, когда вы пытаетесь использовать D const, как C ++. Они не одинаковы, поэтому не используйте их одинаково! Если есть какая-либо вероятность того, что функция может потребовать использования логического const, не помечайте их как побитовые const!