On 2010-11-29 11:24:56 -0500, "Steven Schveighoffer"
<schvei...@yahoo.com> said:
On Mon, 29 Nov 2010 10:56:14 -0500, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:
In fact it's possible to provide logical const with guarantees. You
need a construct that keeps together a bool, a pure
function/delegate/method, and a value, and works like this:
class X
{
int x;
lconst int y = { return x + 42; };
void m1() { x = 2; invalidate(y); }
void m2() const { writeln(y); }
}
You can use the intrinsic invalidate() against a non-const lconst
field, but not against const lconst. Reading that field checks whether
the field has been invalidated. If so, it writes the field with the
result of the function/delegate/method and turns the validation flag
on.
With this system in place, I think the lconst value is guaranteed to be
as strong as const.
This only solves the caching issue (which I agree is a large issue).
There are other cases where you want a mutable pointer to other data
that the object does not own. Such as a widget having a pointer to
its window. Assuming that window draw routines need to be non-const,
a widget cannot draw itself. You need to keep the widget to window
relationship outside the class, or cast. Both of these solutions are
awkward at best.
You can pass the drawing context (the window in your case) as an
argument do the draw function.
--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/