isIterable(T)

Denis Koroskin 2korden at gmail.com
Sun Apr 26 11:00:31 PDT 2009


On Sun, 26 Apr 2009 21:44:31 +0400, dsimcha <dsimcha at yahoo.com> wrote:

> I've been thinking a little more about ranges, etc. and it would be nice  
> to
> have a template for isIterable(T) that simply tells whether an object  
> can be
> iterated over with foreach, without caring how this iteration works  
> (ranges,
> opApply, builtin array/AA).  I have some use cases where I'm writing very
> generic functionality and all I need is the lowest common denominator  
> that,
> given an object T, the following will compile, and to know what type elem
> would be:
>
> foreach(elem; T.init) {}
>
> This functionality does not require any of the more advanced features of
> ranges, just iteration.  Is there any good way to write a template for  
> this?
> Since foreach is a statement, is(typeof()) and __traits(compiles) are  
> out.

// Not tested
template isIterable(T)
{
    static if (is(typeof({foreach(elem; T.init) {}})) {
        const bool isIterable = true;
    } else {
        const bool isIterable = false;	
    }
}





More information about the Digitalmars-d mailing list