the traits trap
Meta via Digitalmars-d
digitalmars-d at puremagic.com
Thu Nov 20 20:42:14 PST 2014
On Friday, 21 November 2014 at 04:08:52 UTC, Steven Schveighoffer
wrote:
> OK, so I'm writing some traits that I'd like my objects to
> satisfy. And I'm having the worst time debugging them.
>
> Most of the traits in D look like this:
>
> enum isSomeType(T) = __traits(compiles, (T t){
> // some statements using t
> // some asserts
> // some static asserts
> });
>
> All good.
>
> Now, let's test my object:
>
> unittest
> {
> static assert(isSomeType!SomeObject);
> }
>
> Nope. Now, how the hell do I figure out why?
>
> I have found the following technique most valuable:
>
> 1. Create a function called "testSomeType(T)(T t)", make it's
> body the same as the trait
> 2. Instead of static asserting the trait, call the function
>
> Much better results! Whichever part of the trait doesn't work
> shows up as a legitimate error, and I can fix the object or the
> trait.
>
> Now, this idiom of using __traits(compiles, ...) is used
> everywhere in phobos. Often times you see things like:
>
> void foo(T)(T t) if (hasSomeTrait!T && hasSomeOtherTrait!T &&
> alsoHasThisOne!T) { ...
>
> If this doesn't compile, the compiler says "Error template
> instance blah blah does not match template declaration blah
> blah blah"
>
> Useless...
>
> Now, even if I want to use my cool technique to figure out
> where the issue is, I have to do it one at a time to each
> trait, and I may have to temporarily comment out some code to
> avoid triggering an error before I get to that point.
>
> When I first came to write this post, I wanted to ask if anyone
> thought it was a good idea to replace the __traits(compiles,
> someLiteral) with __traits(compiles, someFunctionTemplate!T)
> somehow, so if one couldn't do it, you had some easy way to
> debug by calling someFunctionTemplate.
>
> But I hate that idea. This means you have all these do-nothing
> functions whose sole existence is to debug traits. When the
> traits themselves can just do it for you.
>
> Can anyone figure out a good solution to this problem? I like
> template constraints, but they are just too black-boxy. Would
> we have to signify that some enum is actually a trait and so
> the compiler would know to spit out the junk of compiling?
> Would it make sense to add some __traits function that allows
> one to signify that this is a special trait thing?
>
> This is one area that D's templates are very user-unfriendly.
>
> -Steve
There has been a bit of promising work done by Shammah
Chancellor. It's a bit more heavyweight than a template returning
true or false, but it's also more powerful and makes for better
error messages.
http://forum.dlang.org/thread/m219bj$fpa$1@digitalmars.com
More information about the Digitalmars-d
mailing list