Templates and unaryFun!

WebFreak001 d.forum at webfreak.org
Thu Sep 24 13:28:25 UTC 2020

On Thursday, 24 September 2020 at 11:15:11 UTC, ddcovery wrote:
> [...]
> Example: I tried with a global function
>> Dot!R dt(alias fun, T, R)(Dot!T t){
>>  auto f = cast(R function(T)) unaryFun!fun;
>>  return t.dot!R(f);
>> }
> [...]

the problem is the template can't automatically determine the 
type "R". All the template parameters need to be resolvable from 
the arguments you pass into it, R is something magic where it 
doesn't know where it comes from.

To keep the R like you want to right now you can do the following:

Dot!(typeof(unaryFun!fun(T.init))) dt(alias fun, T)(Dot!T t){
	return t.dot(t => unaryFun!fun(t));
Dot!R dt(alias fun, T, R = typeof(unaryFun!fun(T.init)))(Dot!T t){
	return t.dot(t => unaryFun!fun(t));

Note that this might instantiate unaryFun twice though. The 
second alternative here allows users to overwrite R and just 
provides a default (might have useful use cases too)

Alternatively a lot easier would be to just return auto and do:

auto dt(alias fun, T)(Dot!T t){
	return t.dot(t => unaryFun!fun(t));

This doesn't allow users to overwrite the return type exactly but 
it simplifies implementation and doesn't look like it would 
generate any double instantiation.

More information about the Digitalmars-d-learn mailing list