On Friday, 30 January 2015 at 06:35:31 UTC, Jeremy DeHaan wrote:
I have a template fuction that looks like this:

immutable(T)[] getString(T)() const
if (is(T == dchar)||is(T == wchar)||is(T == char))

Basically, I was hoping that the type would be deduced based on the prameter that was being assigned to like so.

string ret = thing.getString();

Apparently that does not work, though. I get informed that the type of the template is not able to be deduced. I'm curious as to why it was not able to deduce it on its own.

Additionally, and I haven't run my code to try this yet, but giving T a default type compiled to my surprise.

immutable(T)[] getString(T=char)() const
if (is(T == dchar)||is(T == wchar)||is(T == char))

Is something like this supposed even to work?

for template type deduction to work, you have to supply an argument. Your type signature would need to look like this:

immutable(T)[] getString(T)(T arg) const

and then T would be deduced from arg.

But string ret = thing.getString(); won't compile because it is rewritten to getString(thing), but your getString function takes no runtime parameters. It looks like the signature I wrote earlier is what you actually want.

As to your second example, it'll work fine. Basically your signature says "only accept dchar, wchar or char, but if nothing's been specified, default to char". But if you rewrite getString to take one parameter, then the default template arg is redundant.

Reply via email to