I think I will dedicate tonight one or two hours to understand
the first two proposals :-D.
On Thursday, 24 September 2020 at 13:28:25 UTC, WebFreak001 wrote:
[...]
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.
[...]
Following your last recommendation, I included de auto version as
a Dot(T) member:
auto d(alias fun)()
{
return dot(a => unaryFun!fun(a));
}
And the syntax is really compact:
assert(
dot(p).d!"a.father".d!"a.father".d!"a.name".d!"a.length".get(0)
== 0);
assert(
dot!Person(null).d!"a.father".d!"a.father".d!"a.father".d!"a.name".get == null);
Great help WebFreak001. Thank you very much !!!