On Tuesday, 29 September 2020 at 01:19:48 UTC, Adam D. Ruppe wrote:
On Sunday, 27 September 2020 at 05:22:36 UTC, 60rntogo wrote:
How would I check if it is actually a free function?

but this doesn't even compile since I defined add inside my main function

aaaaah that's not a free function!!

OK, I see. That makes sense I suppose. Thanks for putting this together, but I'm afraid that I managed to break it again and this time it is really baffling.

---
module foo;

auto invoke(alias fun, Args...)(Args args)
{
static if(__traits(isStaticFunction, fun) || __traits(isNested, fun))
    return fun(args);
  else
    return __traits(child, args[0], fun)(args[1 .. $]);
}

unittest
{
  import std : approxEqual;
  assert(invoke!approxEqual(2.0, 2.001));
}
---

This gives me these errors:

---
source/foo.d(6,48): Error: aggregate or function expected instead of approxEqual(T, U, V)(T value, U reference, V maxRelDiff = 0.01, V maxAbsDiff = 1e-05) source/foo.d(9,41): Error: template std.math.approxEqual cannot deduce function from argument types !()(double), candidates are: /usr/include/dmd/phobos/std/math.d(8479,6): approxEqual(T, U, V)(T value, U reference, V maxRelDiff = 0.01, V maxAbsDiff = 1e-05) source/foo.d(15,28): Error: template instance foo.invoke!(approxEqual, double, double) error instantiating
---

Confusingly, these errors disappear if I include the unit test in my main file (i.e., just add it to the code you posted) rather than foo.d or if I use a function like add defined in the module instead of imported approxEqual. Any ideas?

Reply via email to