On Wed, 01 Sep 2010 09:03:39 -0400, Justin Johansson <n...@spam.com> wrote:

IIRC std.contracts has been deprecated and replaced by std.exception,
enforce and friends.  The latter are runtime things, correct(?).

Is there a valid use case for compile-time (i.e. subject to static
analysis) design-by-contract (DBC) enforce-like machinery?

For example, and perhaps not the best example, one might like to pass
an array of Foos to a function which by static design expects to
receive such array at runtime as containing a minimum and/or maximum of
elements.  Should (i.e. could it be desirable that) such interface
contracts be checkable at compile-time?

Compile time checks are only available for compile time values. If you have a function like this:

void foo(int[] x)

There is no way at compile time to check whether x has a maximum or minimum number of elements. But if you have something like this:

void foo(uint N)(ref int[N] x)

Then you can check N, because it is a compile-time value. you can make checks via template constraints or static assert statements:

void foo(uint N)(ref int[N] x) if(N >= minvalue)

- or -

void foo(uint N)(ref int[N] x)
{
static assert(N >= minvalue, "Error, invalid sized array passed to foo");
}

Both of these will fail to compile if you pass incorrect data.

-Steve

Reply via email to