enforcing alias this on derived types
John Colvin
john.loughran.colvin at gmail.com
Mon Jul 8 02:52:43 PDT 2013
On Monday, 8 July 2013 at 08:59:16 UTC, JS wrote:
> I have an interface that I would like to make sure that any
> classes derived from it will use alias this, else it can
> potentially break code.
>
> interface A(T)
> {
> @property T Value();
> @property T Value(T value);
> // need to enforce alias _value this somehow
> }
>
> class B(T) : A!T
> {
> private T _value;
> @property T Value() { return _value; }
> @property T Value(T value) { return value = _value; }
> alias _value this;
> // B must use alias this so B(T) behaves like type T
> }
I can't think of a neat way to do this. However,if you don't mind
a nasty solution:
You can just force the derived class writer to write a function
that checks. Even if they just put in a no-op, it acts as a very
solid reminder that will also be visible to anyone else reading
their code.
struct S{}
interface I
{
void checkForAliasThis();
}
class A : I
{
void checkForAliasThis()
{
static assert(is(typeof(this) : S));
}
S s;
alias s this;
}
Most other solutions I tried failed because the compiler
evaluates the check (e.g. out contracts) in the interface, which
makes the check either semantically wrong, or statically
false/failed.
More information about the Digitalmars-d-learn
mailing list