Declaring run time variables

splatterdash via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 5 16:16:32 PDT 2014


On Monday, 4 August 2014 at 22:45:15 UTC, anonymous wrote:
> On Monday, 4 August 2014 at 22:18:24 UTC, splatterdash wrote:
>> Indeed I do. I'm not sure which type I should use for the 
>> common base type, though. MyFileReader is a templated class, 
>> so using it plainly did not work. I also tried 
>> `InputRange!string` to no avail despite `MyFileReader` 
>> implementing the three InputRange requirement (popFront(), 
>> front, and empty).
>>
>> Any ideas on what I should as the class?
>
> Let MyFileReader implement an interface that has the operations
> you need. That interface can be std.range.InputRange!string, or
> you can define your own.
>
> Note that a type is an input range when it has the input range
> primitives (front, popFront, empty), but it's only a
> std.range.InputRange!T when it implements the interface in the
> OOP sense: class C : InputRange!E {...}.
>
> Phobos generally doesn't use InputRange, but templatizes
> everything. You can go that way, too, and move the foreach loop
> to a templated function:
>
> void main()
> {
>      File f = File("input_file")
>      // detect gzip ...
>      if (isGzip)
>          doThings(new MyFileReader!GzipIterator(f));
>      else
>          doThings(new MyFileReader!NormalIterator(f));
> }
> void doThings(I)(I fileIter)
> {
>      foreach(string line; fileIter) {
>      // do things
>      }
> }

That does it, thanks :)!


More information about the Digitalmars-d-learn mailing list