www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Anyway to compare function aliases? Or any ideas?

reply aliak <something something.com> writes:
Any ideas on how to be able to do something like this?

struct S(alias _fun) {
   alias Fun = _fun;
}

void algorithm(alias f, T)(T s) {
   static if (&f == &T.Fun) {
     // trivial return
   } else {
     // must perform work, then return
   }
}

Can you use function addresses in some way? I've seen that some 
of them are resolved to __lambda0 and other times to a function 
type, i.e.

Error: incompatible types for (& f) is (& __lambda1): void 
function(A!(function () => 3) t) and int function() pure nothrow 
 nogc  safe

That comes from doing doing this:

alias g = () => 3;
algorithm!g(S!g());

I've thought of something along the lines of a function alias 
wrapper. But I'm not sure how to make that work either. Something 
like:

struct Fun(alias _fun, string _id) {
   alias Fun = _fun;
   enum ID = _id;
}

Then maybe something like:

alias g = () => 3;
Fun!(g, "myid") gfun;
algorithm!gfun(S!gfun());

Then inside algorithm the check becomes:

static if (&f.ID == &T.Fun.ID)

But then I'd like to generate the ID at instantiation point. So 
is using __LINE__, __FILE__ and applying some hash function a 
good idea here?

Any other ideas?

Cheers,
- Ali

PS: If you're curious of a semi working sample, to see what I'm 
actually trying to do, I've put up this gist that does not 
compile right now:

https://gist.github.com/aliak00/fcdd4fa7512035405bb7015cf6d8016f
Jul 04 2019
parent reply Marco de Wild <mdwild sogyo.nl> writes:
On Thursday, 4 July 2019 at 15:10:05 UTC, aliak wrote:
 Any ideas on how to be able to do something like this?

 struct S(alias _fun) {
   alias Fun = _fun;
 }

 void algorithm(alias f, T)(T s) {
   static if (&f == &T.Fun) {
     // trivial return
   } else {
     // must perform work, then return
   }
 }

 Can you use function addresses in some way? I've seen that some 
 of them are resolved to __lambda0 and other times to a function 
 type, i.e.

 Error: incompatible types for (& f) is (& __lambda1): void 
 function(A!(function () => 3) t) and int function() pure 
 nothrow  nogc  safe

 That comes from doing doing this:

 alias g = () => 3;
 algorithm!g(S!g());

 I've thought of something along the lines of a function alias 
 wrapper. But I'm not sure how to make that work either. 
 Something like:

 struct Fun(alias _fun, string _id) {
   alias Fun = _fun;
   enum ID = _id;
 }

 Then maybe something like:

 alias g = () => 3;
 Fun!(g, "myid") gfun;
 algorithm!gfun(S!gfun());

 Then inside algorithm the check becomes:

 static if (&f.ID == &T.Fun.ID)

 But then I'd like to generate the ID at instantiation point. So 
 is using __LINE__, __FILE__ and applying some hash function a 
 good idea here?

 Any other ideas?

 Cheers,
 - Ali

 PS: If you're curious of a semi working sample, to see what I'm 
 actually trying to do, I've put up this gist that does not 
 compile right now:

 https://gist.github.com/aliak00/fcdd4fa7512035405bb7015cf6d8016f
I don't know if it will solve your whole problem, but have you tried __traits(isSame, W0.fun, fun)? Reduced example: struct Foo(alias fun){ alias bar = fun; } void stuff(alias fun, T)(T t) { static if(__traits(isSame, fun, T.bar)) { pragma(msg, "Yes"); } else { pragma(msg, "No"); } } void a(){} void b(){} void main() { stuff!a(Foo!a()); // Yes stuff!a(Foo!b()); // No }
Jul 04 2019
parent aliak <something something.com> writes:
On Thursday, 4 July 2019 at 15:22:08 UTC, Marco de Wild wrote:
 On Thursday, 4 July 2019 at 15:10:05 UTC, aliak wrote:
 [...]
I don't know if it will solve your whole problem, but have you tried __traits(isSame, W0.fun, fun)? Reduced example: struct Foo(alias fun){ alias bar = fun; } void stuff(alias fun, T)(T t) { static if(__traits(isSame, fun, T.bar)) { pragma(msg, "Yes"); } else { pragma(msg, "No"); } } void a(){} void b(){} void main() { stuff!a(Foo!a()); // Yes stuff!a(Foo!b()); // No }
Of course! That helps a lot yes. Thank you :) The case in the gist I pasted above works like a charm now. isSame seems like a decent enough powerhouse to get most of the practical cases it seems as well.
Jul 04 2019