On Sun, 29 Jun 2014 22:24:09 -0400, David Bregman <d...@sfu.ca> wrote:

Suppose I have a C library which implements a function for several types. C doesn't have overloading, so their names will be distinct.

extern(C):
double foo_double(double);
float foo_float(float);

Now I want to build a D wrapper, and merge them into a single function with overloading:

T foo(T)

I could write out the two overloads manually:
double foo(double d) { return foo_double(d); }
float foo(float f) { return foo_float(f); }

but this isn't compile time, it will generate a stub function for each overload, meaning the wrapper will have performance overhead unless inlining can be guaranteed somehow.

This is the correct answer. It should be inlined, and inlining should work as long as -inline is passed to the compiler. I don't think there is another way.


Is it possible to do something like
alias foo = foo_double;
alias foo = foo_float;

Right, you cannot overload aliases as far as I know. foo either refers to foo_double, or foo_float. You can't bring in those as overloads under the name foo.


or

template(T) foo {
   static if(T is double) {
     alias foo = foo_double;
   } else {
     // etc.
   }
}

These doesn't work of course.

This last one looks like it should work. But IFTI ONLY works if you don't do what you did :) Basically, IFTI cannot see through static if to determine how to instantiate. It needs to be a clear single function.

For example, how would IFTI figure it out if you did this?

template(T) foo {
   static if(T is double) {
      alias foo = foo_float;
   } else {
      // etc.
   }
}

It can't figure out what T is without looking at what the alias would be, but in order to look at the alias, it needs to decide T!

I don't fully understand the template syntax yet, but I have a feeling this is possible with templates. Is it possible to do what I'm trying to do?

It seems like it should be possible, but I think we would need a new type of implicit determination for templates that was not a function template.

-Steve

Reply via email to