On 02/26/2016 06:09 PM, Andrei Alexandrescu wrote:
A generic function receives an argument called "partition" by alias.
That may work in one of the following ways:
partition(range);
partition!less(range);
partition!less(range, n); // n is a number
I tried this:
static if (is(partition == function) || is(partition == delegate))
partition(r);
else if (__traits(compiles, partition!less(r, n)))
partition!less(r, n);
else
partition!less(r);
The first test works very nice. The second does not; the compiler
attempts to instantiate the template wrongly and spits a bunch of errors
before giving up, in spite of the whole "let me know silently whether
this compiles" thing.
So, what's an elegant solution to this? I looked up std.traits but
nothing seems to help. (Tried arity, no avail.)
Urgh, forgot the "static" in front of the second "if". It does work now.
Nevertheless, I'm still on lookout for a more elegant solution! I have
this mindset that using __traits(compiles) is some sort of cheating.
Andrei