Templates, implicit conversions and const
Kirk McDonald
kirklin.mcdonald at gmail.com
Mon Jul 9 11:42:26 PDT 2007
Regan Heath wrote:
> The 2nd thing which irritated me a little over the weekend was how
> templates and const can interact. For example:
>
> bool contains(T)(T[] array, T value)
> {
> foreach(v; array) if (v == value) return true;
> return false;
> }
>
> void foo(const(char) c) {}
>
> void main()
> {
> string tests = "test";
> char[] testc = tests.dup;
>
> tests.contains(cast(const(char))'a');
> contains!(const(char))(tests, 'a');
> testc.contains('a');
> foo('a');
> }
>
>
>
> The cast in the first contains call is required, without it we get the
> error:
>
> C:\D\src\tmp\tplconst.d(14): template tplconst.contains(T) cannot deduce
> template function from argument types (const(char)[],char)
>
> The available templates are:
> (const(char)[],const(char))
> (char[],char)
>
> And looking at the template argument deduction rules I can see why it
> cannot find a match. T is found to be both 'const(char)' and 'char'.
>
> But, I wonder if it should then apply the standard function overloading
> rule:
>
> "In D, function overloading is simple. It matches exactly, it matches
> with implicit conversions, or it does not match. If there is more than
> one match, it is an error."
>
> If it performed implicit conversion on 'char' it could get 'const(char)'
> and would therefore match the template:
>
> (const(char)[],const(char))
>
> It cannot implcitly convert 'const(char)[]' to 'char[]' so it will never
> match the other option.
>
> Thoughts?
>
> Regan
Re-write the function as:
bool contains(T, U)(T[] array, U value) {
foreach(v; array) if (v == value) return true;
return false;
}
You can still compare a const(char) and a char for equality.
--
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org
More information about the Digitalmars-d
mailing list