Exporting template function instances to C
Nicholas Wilson via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Mar 23 18:00:31 PDT 2017
On Thursday, 23 March 2017 at 19:46:43 UTC, data pulverizer wrote:
> On Thursday, 23 March 2017 at 17:58:21 UTC, H. S. Teoh wrote:
>> On Thu, Mar 23, 2017 at 05:29:22PM +0000, data pulverizer via
>>>
>>> Thanks. Is there a less ham-handed way of exporting them
>>> other than wrapping them in functions as I have?
>>
>> Wrapping them in functions is probably the simplest way to
>> call them from C. You *could*, I suppose, use their mangled
>> names directly, then you wouldn't need a wrapper, but that
>> would be rather difficult to use on the C end. On the D side,
>> there's .mangleof that will tell you what mangled names to
>> use, but if you're calling from C you don't have that luxury.
>>
>>
>> T
>
> Thanks. Mangling sounds painful and scary, I think I'll stick
> to wrapping which sounds much less dangerous.
There's nothing scary or dangerous about it. It happens
automatically to allow overloads and templates so that you get a
unique symbol foreach version (unless you use extern(C),
extern(C++) or pragma mangle). C++,Java and any other compiled
language that has overloads does mangling. Heck, you can even do
it in C with __attribute__((overloadable)) (at least with clang),
it just transparently mangles (just as in D)the name as whatever
C++ would mangle it as.
So instead of doing
T mult(T)(T x, T y)
{
return x*y;
}
doing something like
template mult(T)
{
extern(C++) T mult(T x, T y)
{
return x*y;
}
}
in D, and then in C (noting that you have to declare the name and
signature anyway)
__attribute__((overloadable)) float mult(float,float);
__attribute__((overloadable)) double mult(double, double);
which I think is the least painful way of doing it. I seem to
remember somewhere in phobos
template Instantiate(alias a)
{
alias Instantiate = a;
}
to instantiate template, because you reference them from another
symbol it somehow magically works. Used like
Instantiate!(mult!float); // at module scope
More information about the Digitalmars-d-learn
mailing list