On Sun, 29 Jul 2012 19:11:17 +0200, Chad J <chadjoan@__spam.is.bad__gmail.com> wrote:

So there. Now, you simply use auto a = constrain!isInputRange(
expression );. Is this what you wanted?

That's pretty good. It's still not as concise or easy to discover as the language's natural syntax for type declarations, but it's the kind of thing I'd use for my own purposes as a trick to get around language limitations.

It's likely as good as it gets without changing the language. Of course,
if you use this a lot with the same predicate, you could alias it to
something shorter:

alias constrain!isInputRange InputRange;

auto a = InputRange(expression);

Note also that the implementation supports multiple predicates, hence the
supplied hasElementType. And this is where aliases really come in handy:

template hasElementType( T ) {
    template hasElementType( U ) {
        enum hasElementType = is( ElementType!U == T );
    }
}

alias constrain!(isInputRange, hasElementType!int) IntRange;

auto a = IntRange([1,2,3]);

--
Simen

Reply via email to