On 2014-01-09 21:27, H. S. Teoh wrote:

Yeah, that error drives me up the wall too. I often get screenfuls of
errors, dumping 25 or so overloads of some obscure Phobos internal
function (like toImpl) as though an end-user would understand any of it.
You have to parse all the sig constraints (and boy some of them are
obscure), *understand* what they mean (which requires understanding how
Phobos works internally), and *then* try to figure out, by elimination,
which is the one that you intended to match, and why your code failed to
match it.

I'm almost tempted to say that using sig constraints to differentiate
between template overloads is a bad idea. Instead, consider this
alternative implementation of toImpl:

        template toImpl(S,T)
                // N.B.: no sig constraints here
        {
                static if (... /* sig constraint conditions for overload #1 */)
                {
                        S toImpl(T t)
                        {
                                // implementation here
                        }
                }
                else static if (... /* sig constraint conditions for overload 
#2 */)
                {
                        S toImpl(T t)
                        {
                                // implementation here
                        }
                }
                ...
                else // N.B.: user-readable error message
                {
                        static assert(0, "Unable to convert " ~
                                T.stringof ~ " to " ~ S.stringof);
                }
        }

By putting all overloads inside a single template, we can give a useful
default message when no overloads match.

If I recall correctly, Andrei has mentioned that something like the above doesn't works so well with __tratis(compile).

--
/Jacob Carlborg

Reply via email to