More than one invariant per struct/class
Jonathan M Davis
jmdavisProg at gmx.com
Sat Aug 6 13:53:31 PDT 2011
On Saturday 06 August 2011 22:40:15 simendsjo wrote:
> On 04.08.2011 11:32, simendsjo wrote:
> > I would like to use a template mixin to add some fields to a struct, but
> > I'd also like the template to add additional invariant checks without
> > having to remember to add this for all struct/classes that mixes in this
> > code.
> >
> > class C {
> > int a;
> > }
> >
> > mixin template EmbedC() {
> > C _c;
> >
> > // oops.. more than one invariant
> > invariant() {
> > assert(_c);
> > }
> >
> > void close() {
> > _c = null;
> > }
> > }
> >
> > struct S {
> > int i = 10;
> > invariant() {
> > assert(i >= 10);
> > }
> >
> > mixin EmbedC!();
> > }
> >
> > void main() {
> > S s;
> > s.close();
> > s._c.a = 10; // access violation, but I want assertion from invariant
> > }
>
> Should I create a feature request to support more than one invariant?
> It's pretty obvious that it works as designed given the nice error
> message though..
Feel free to create a feature request on it. It may even get the language
changed. However, having more than one invariant complicates things a bit,
since right now, it's easy for the runtime to just call the one invariant. If
you had multiple invariants, they would have to be merged somehow by the
compiler. It's completely doable, but it definitely complicates things, which
is probably why it doesn't work that way now.
If you wanted to be able to do it now though, I'd suggest that the mixins not
have invariants but that they have functions which you then have to call in
the invariant of the type that they're being mixed into. It's more error
prone, since you could forget to call one of those functions in the invariant,
but it allows you to have invariants of a sort in the mixed in code and still
only have one invariant for the type.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list