Can D do some sort of automatic template to "dynamic template" wrapping

Adam via Digitalmars-d digitalmars-d at puremagic.com
Sat Sep 19 14:12:51 PDT 2015


On Saturday, 19 September 2015 at 18:36:49 UTC, Adam D. Ruppe 
wrote:
> On Saturday, 19 September 2015 at 17:46:27 UTC, Adam wrote:
>> I doubt anyone would read all so I'll stop now ;)
>
> What you're asking is actually pretty easy. You can just write 
> a function that loops to form the object list yourself or you 
> could make the template add a static module constructor that 
> adds itself to the call list. Then you tag your object with its 
> typeinfo and use that as index into the list.


It might be, but I don't see how it can be done easily. I don't 
know enough about D to know if it is implementable as a library 
solution.

Suppose our templated function is

auto foo(T)(T x) { return x; }

and suppose we specialize it with

auto foo(T : object)(T x)
{

     // The static part of the dispatch would look something like
     static if (is(T == int ) {
         return foo!int(cast(int)x);
     ....
     // This stuff should all be optimized out at compile time 
if/when the if passes
     // In fact, it would never be called in this example since 
int is more special than object. This part is more for when we 
don't specialize on object and just create a wrapper for the 
templated function.




     // If no compile time dispatch, then we need to deal with the 
unknown type using run-time reflection, we still want to dispatch 
known types to the foo but no optimization can occur here

     if (cast(int)x)
        return foo!int(cast(int)x);
     // Anymore?
     else
        return foo!object(x); // or foo!unknown(x)

}


foo!object should, in theory, work for all types, run-time or not.

But you say constructing foo!object is easy?!?!?! Remember, it 
has to work in general for all types and number of parameters and 
should always optimize to a direct template call when the compile 
time checks are satisfied.

Also, the above doesn't allow for dynamic specialization, but 
that would be easy to add with a lookup table.

The main problem I see, which you say is easy, is how to know the 
list of types to check against? int is the only one used above, 
but in reality, it depends on context. If the programmer used 
foo!float, we would have to add that to the dispatch list. We 
don't want to add it if he doesn't use it because then we are 
including extra code in the binary that might never be used. It 
may be used at run time but that's up to the programmer to make 
sure it is include(by using it at compile time at least ones or 
through some other method).










More information about the Digitalmars-d mailing list