We can already kind of do what you're asking without a language feature. For instance, if you want to define that something is a type of range...

struct MyRange { ... }

static assert(isInputRange!MyRange); // won't compile unless MyRange is an input range

On Wednesday, 9 May 2012 at 15:04:51 UTC, İbrahim Gökhan YANIKLAR wrote:
// implement foo's without constraints
//------------------------------------------------------------

void foo(Range)(Range r)
        if (isInputRange!Range && !isForwardRange!Range)
{ }

void foo(Range)(Range r)
        if (isForwardRange!Range && !isBidirectionalRange!Range &&
!isRandomAccessRange!Range)
{ }

void foo(Range)(Range r)
        if (isBidirectionalRange!Range && !isRandomAccessRange!Range)
{ }

void foo(Range)(Range r)
        if (isRandomAccessRange!Range)
{ }

And these could certainly use some library sugar. How about this:

template isJustInputRange(R) {
enum bool isJustInputRange = isInputRange!R && !isForwardRange!R;
}

template isJustForwardRange(R) ...etc...


Reply via email to