On 03.10.2018 20:22, Paul Backus wrote:

In my experience doing metaprogramming in D, it's best to make your static if/template constraint tests as narrow and specific as possible. For example, if you want to know whether you can call a function with a particular argument, you don't need to muck around with std.traits; you can just check whether the function call compiles:

     static if(__traits(compiles, f(arg))) {
         // do something with f(arg)
     }

So my question to you is: why do you care whether something is a symbol or a value? Is there actually a more specific question that you're trying to answer with that information? If so, just ask the more specific question directly.
I did like you does. It failed. It's suitable for some local things, but if you need more general solution it fails. You don't know why your code doesn't compile. If `f` is template it can hurt because failed instantiation may lead to wrong code path you don't expect. For example your code has two paths - when the code compiles and doesn't. You or someone else later adds template function like `f` but makes just typo in function body - wrong code path taken and you won't know it until start fixing bug somewhere else.
Now I prefer to use `hasMember` and also check args at least for length.
More specific question is that I distinct values and symbols by taking address and it looks like hack for me. I'll try to show example later.

Reply via email to