[Issue 17982] New: Support for const(Class) in algorithm.searching.extremum

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Nov 14 09:31:49 UTC 2017


https://issues.dlang.org/show_bug.cgi?id=17982

          Issue ID: 17982
           Summary: Support for const(Class) in
                    algorithm.searching.extremum
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody at puremagic.com
          Reporter: aurelien.fredouelle+dlang at gmail.com

Initially reported in
https://forum.dlang.org/post/bigzmlszipzpcrpmwmiv@forum.dlang.org

It is not possible to use minElement on an array of const objects:

class A
{
  int val;
}

const(A) doStuff(const(A)[] v)
{
  import std.algorithm.searching : minElement;
  return v.minElement!"a.val";
}

This gets the following compiler error:

std/algorithm/searching.d(1256,28): Error: cannot implicitly convert expression
(front(r)) of type const(A) to app.A
std/algorithm/searching.d(1286,35): Error: cannot implicitly convert expression
(r[i]) of type const(A) to app.A
std/algorithm/searching.d(1258,36): Error: template instance
std.algorithm.searching.extremum!("a.val", "a < b", const(A)[], A) error
instantiating
std/algorithm/searching.d(3345,24):        instantiated from here:
extremum!("a.val", "a < b", const(A)[])
source/app.d(11,11):        instantiated from here: minElement!("a.val",
const(A)[])

This seems to be because the extremum helper function is using Unqual!Element
to hold the current extremum, which cannot be assigned to when Element is
const.

In the forum thread, @vit suggested using something like this instead:

template RebindableOrUnqual(T){
        static if (is(T == class) || is(T == interface) || isDynamicArray!T ||
isAssociativeArray!T)alias RebindableOrUnqual = Rebindable!T;
        else alias RebindableOrUnqual = Unqual!T;
}

--


More information about the Digitalmars-d-bugs mailing list