According to the documentation Tuple.toString should be a function, but is not recognized as such. The assert below fails: void main() { import std.traits : isSomeFunction; import std.typecons : Tuple; static assert(isSomeFunction!(Tuple!(int)(0).toString)); }
std.typecons.Tuple.toString is not a function. It's a template. And the documentation says so [1]. So I think it's expected that isSomeFunction [2] returns false, as it's only supposed to accept functions, function pointers, and delegates. I'm not sure why toString is a template, though. It's wrapped twice in zero-parameters templates, with no comment as to why. There may have been bugs or language limitations in the past that made this necessary. But now, Tuple being a template should be enough to trigger attribute inference for its methods, and templates and non-templates should be able to coexist in an overload set. So it may be possible to just remove the `template toString()` and the extra empty parentheses from `string toString()()`. Then isSomeFunction would return true for Tuple.toString. [1] http://dlang.org/phobos/std_typecons.html#.Tuple.toString [2] http://dlang.org/phobos/std_traits.html#isSomeFunction
That makes sense, thanks for the explanation. Might be useful to add an isField attribute to traits. Previously I assumed that if something !isSomeFunction it would be a field, but that does not seem to be the case. Now changed that assumption to also ignore templates.