Użyj zewnętrznego strukturę danych do przechowywania zmienny obiekty:
struct A
{
static C[const(A)*] _c1s, _c2s;
void compute(ref const(R) r) const
{
_c1s[&this] = ...
_c2s[&this] = ...
}
}
Używam &this
jako klucz do zewnętrznego tabeli mieszania, ale prawdopodobnie będzie lepiej wyłączyć za pomocą jakiegoś unikalnego identyfikatora . To bardzo brzydkie i trudne rozwiązanie. Nie lubię tego. Należy również zauważyć, że tablice skrótów są lokalnymi wątkami, więc ten sam obiekt będzie miał różne wartości na różnych wątkach. Może to być pożądane lub nie dla twojej aplikacji.
zastanowić się, jak użyć const
w D.
D, const
jest przechodnia i bitowe tj logiczne const nie jest obsługiwane. Ma to na celu zabezpieczenie przed współbieżnymi współdzielonymi zapisami danych. Nawet jeśli twój kod może być logicznie const prawidłowy, to nadal będzie się zrywał, jeśli dwa wątki próbowały wywołać compute
na tym samym obiekcie, więc D nie zezwala na to i nie zapewnia legalnej ucieczki (nr mutable
).
Zasadniczo należy oznaczać funkcje jako const
tylko wtedy, gdy są bitowe const.
Powoduje to, że powinieneś używać const
dużo mniej w D niż w C++, ponieważ potrzebujesz const bitowej o wiele mniej niż potrzebujesz stałej logicznej.
Jako przykład rozważmy prosty (bezsensowne) generic equal
funkcyjny, który mówi, czy dwa obiekty są równe:
bool equal(T)(T lhs, T rhs) { return lhs == rhs; }
Zauważ, że nie zostały oznaczone parametry funkcyjne jak const
. Jest to celowe. Testowanie równości nie powinno wymagać stałej bitowej - wymaga tylko stałej logicznej, więc wymuszenie poziomu const na obiektach byłoby niepotrzebnie restrykcyjne.
Jak jA_cOp mówi, społeczność D nie widzi miejsca dla logicznej stałej w D, na lepsze lub na gorsze. Problem pojawia się, gdy próbujesz użyć const D's jak const C++. Nie są one takie same, więc nie używaj ich w taki sam sposób! Jeśli istnieje jakakolwiek możliwość, że funkcja może wymagać użycia stałej logicznej, nie oznaczaj jej jako stałej bitowej!
Jest to podobne pytanie: http://stackoverflow.com/questions/4219600/logical-const-in-d –