digitalmars.D.learn - Anyway to compare function aliases? Or any ideas?
- aliak (43/43) Jul 04 2019 Any ideas on how to be able to do something like this?
- Marco de Wild (22/65) Jul 04 2019 I don't know if it will solve your whole problem, but have you
- aliak (5/28) Jul 04 2019 Of course! That helps a lot yes. Thank you :)
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
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/fcdd4fa7512035405bb7015cf6d8016fI 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
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: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.[...]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