On Sun, 28 Mar 2010 23:46:55 +0400, Steven Schveighoffer
<schvei...@yahoo.com> wrote:
On Sun, 28 Mar 2010 14:29:52 -0400, so <s...@so.do> wrote:
What you want is implicit function template instantiation based on the
return type. D doesn't do that, it doesn't even allow overloading
based on the return type. However, you can infer the return type
using auto:
auto inv(T)(T m)
{
return 1.0/m;
}
-Steve
Hello!
I guess, i am unable to express myself.
In code :
T inv(T)(T m) {
return 1.0/m;
}
If we forget the rules of default literals that C derived languages
have, just for a second.
And enforce our own little rule.
- no implicit casts
With this in mind this code says; i gave you T, give me T in return,
perfectly clear i guess?
Now when you call the function with a floating point, real, double,
float..., you will get what you asked for.
Now what about other types? Say you call it with a non floating type,
when compiler tries to divide the first thing
it will encounter that one of two elements of the operation is a
non-float, since we enforced a rule, it gives warning or error.
What you are asking for is a template instantiation that depends on
instantiating itself. How about a function like this?
void foo(int x);
T inv(T)(T m) {
foo(m);
return 1.0/m;
}
How do you know what type to use for T? It's simple when you make inv a
one-liner, there is only one thing to look at. But as you start making
the function more complex, then it's impossible to tell what the user
actually wants. In this instance, T must be implicitly convertable to
int, but also must be a floating point type. Clearly there is an error
here, but where is it? This is called ambiguity, and to avoid it, the
compiler makes a decision, right or wrong, based on the literal used to
call the function. It expects you, the user, to help out when it
doesn't make the right one. I don't think it's too much to ask. It's
simply a tradeoff between being an all-powerful oracle-like compiler and
being a simple-to-write compiler.
I don't think a language/compiler should make premature decisions when an
ambiguity happens,
What is warning or error mechanism for then?
In your case, we have a rule at hand, and you broke it. That should
require an explicit cast,
Also, when you have a framework, you would have the T version of the "foo"
right? I guess i am missing something here.
What the compiler sees when deciding to instantiate is this:
T inv(T)(T m) {...}
And it makes a decision.
I am perfectly fine with that.
If you have a problem with writing inv(5.0) instead of inv(5), then
maybe D just isn't for you.
-Steve
I am not sure what you mean really? You mean the other way around? i want :
inv(5.0f), inv(5.0d), inv(5.0L)
or
T x; inv(x); // where T is floating point type.
Thanks.
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/