On 02/10/2015 01:08 AM, bearophile wrote:
> // Not OK
> void bar(size_t N)(int[N] a, int[N ^^ 2] b) {}
> So perhaps my suggestion to file an enhancement request is not
> a good idea...
I am not sure. Although the template system already does pretty clever
deductions, I think they are all based on hints given by the programmer.
They work "forward" from the rules.
However, both in your example above and in ted's code, the compiler has
to solve a problem similar to declarative programming languages to
arrive at the intent. For example, it must apply sqrt to the second
length to figure out N.
Admittedly, it is not apparent in the code above because the first
parameter is already trivially N so the human reader thinks "N comes
from the first argument and it must also satisfy the second argument".
The following would ask the compiler to work backward from the argument:
void bar(size_t N)(int[N ^^ 2] b) {}
"Take a value from the argument, take its square root and then use that
value to figure out the instantiation value of this template."
Ali