Walter Bright wrote:
Currently, that can't be done. But it would be good to get it in for D2. The question is, what rule to use?

Yay! I've been waiting for this! :)


I suggest that:

1. if any functions match, then overload functions the usual way

2. if no functions match, then overload the function templates the usual way

Or reverse the priority of the two.

What do you think?

I think:

  1: Look for exact function matches
  2: Look for exact function template matches
  3: Look for compatible function matches
  4: Look for compatible function template matches


If you are going to allow ordinary and templated functions to overload against each other, there is a problem with IFTI that I think will become more visible. It's something I run into all the time:

  T sum(T)(T a, T b) { return a + b; }
  real x = 2.0;
  real y = sum(1.0, x);

The above doesn't compile, because 1.0 is a double literal, while x is a real. However, if this was an ordinary function with T->real, it would be valid code. I think it should also work with templates.


Granted, I don't know how the matching procedure works now, but for this case I picture it could be something like this:

Given:
  T sum(T)(T a, T b, T c) { return a + b + c; }
  sum(x, y, z);

then do the following:

  1: Try T = typeof(x). If it works, use it.
  2: Try T = typeof(y). If it works, use it.
  3: Try T = typeof(z). If it works, use it.
  4: Give template matching error.

-Lars

Reply via email to