On Friday, 20 January 2023 at 04:46:07 UTC, Ali Çehreli wrote:
Different instantiations of templates are distinct types. For example, if I called 'alternate' with two 'long' values, both alternate!int (as instantiated by the code above) and alternate!long would have different MyResult struct types.

In general, the ranges are compatible with each other because they use the empty, front, popFront interface. In the example below, different types (one of which is double) but the same ranges can be combined with chain(). However, it is necessary to convert it to array because of the opCmp() compatibility from algorithms such as sorting.

```d
  import std.algorithm : sort;
  import std.conv      : to;
  import std.range;
  import std.stdio;


  enum limit = 5;
  enum step = limit / 10.0;/*
  enum step = 1; //*/

void main()
{
  TypeInfo rangeType;   
        
  auto a = iota(limit);
  auto b = iota(step, limit, step);
        
  /* <- toggle comment, please add -> /
  auto ab = chain(a, b);
  rangeType = typeid(ab);/*/
  auto arrA = a.array.to!(double[]);
  auto arrB = b.array;
  auto ab = chain(arrA, arrB);
  rangeType = typeid(ab.sort);//*/
                
  ab.writeln(": ", rangeType);
} /*
current print:
==============
[0, 0.5, 1, 1, 1.5, 2, 2, 2.5, 3, 3, 3.5, 4, 4, 4.5]: std.range.SortedRange!(std.range.chain!(double[], double[]).chain(double[], double[]).Result, "a < b", 0).SortedRange

other print:
============
[0, 1, 2, 3, 4, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5]: std.range.chain!(std.range.iota!(int, int).iota(int, int).Result, std.range.iota!(double, int, double).iota(double, int, double).Result).chain(std.range.iota!(int, int).iota(int, int).Result, std.range.iota!(double, int, double).iota(double, int, double).Result).Result
```
SDB@79

Reply via email to