On 03/11/2015 03:44 PM, Paul D Anderson wrote:
This used to work in D2.065:
given
1) public T mul(T)(in T x, in T y,
Context context = T.context) if (isDecimal!T)
// one template parameter for the two input values
and
2) public T mul(T, U)(in T x, U n, Context context = T.context)
if (isDecimal!T && isIntegral!U)
// two different template parameters for the two input values
then
3) dec9 arg1 = dec9("1.20");
long arg2 = 3;
result = mul(arg1, arg2);
// correctly deduced function
But now (D2.066.1) either 1) has to be changed to
1) public T mul(T, U)(in T x, U y, Context context = T.context)
if (isDecimal!T && isDecimal!U)
// two identical template parameters for the two input values
or 3) has to be changed to
3) dec9 arg1 = dec9("1.20");
long arg2 = 3;
result = mul!(dec9,long)(arg1, arg2);
// template parameters have to be made explicit
Is this expecded behavior?
Paul
Hint: It makes it much simpler to work with complete code. The following
code took a while for me to put together:
template isDecimal(T)
{
enum isDecimal = true;
}
template isIntegral(T)
{
enum isIntegral = true;
}
public T mul(T)(in T x, in T y,
Context context = T.context) if (isDecimal!T)
// one template parameter for the two input values
{
return x;
}
alias Context = int;
public T mul(T, U)(in T x, U n, Context context = T.context)
if (isDecimal!T && isIntegral!U)
// two different template parameters for the two input values
{
return x;
}
struct dec9
{
string s;
enum context = 42;
}
void main()
{
dec9 arg1 = dec9("1.20");
long arg2 = 3;
dec9 result = mul(arg1, arg2);
// correctly deduced function
}
Yes, it fails with 2.066.1 but compiles fine with git head.
Ali