www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Best way to explicitly control the attributes of a template function

Jack Stouffer and I have been working on a pull request for 
Phobos to enable runtime dispatch for field and property access:
     https://github.com/D-Programming-Language/phobos/pull/4070
(It's useful when directly porting code from dynamic languages 
like Python.)

Working with fields in this fashion is pretty easy, but I've hit 
a snag for property methods: if even one of the available 
property methods is impure, unsafe, etc., then the dispatch 
function must also be impure/unsafe/whatever.

In order for the dispatch function to be usable in 
pure/ safe/etc. code, it needs to filter out those property 
methods which are not. This is simple enough - except that 
*which* attributes are required cannot be inferred from the 
context; it must be explicitly specified by the user of the 
dispatch template - somehow...

A naive way to do it would be this:

     template example(string attrs = "pure  safe nothrow  nogc")
     {
         mixin("void example() " ~ attrs ~ " { /* do something */ 
}");
     }

Which could then be used like this:

     example!"pure  safe  SomeUDA"();

That's pretty ugly though, since it requires that all template 
functions with explicit attribute control be implemented as 
string mixins.

Is there a better way to do this? If not, I think consideration 
should be given (long-term) to adding an "attribute set" 
construct as a new type of template parameter.
Apr 02 2016