Templates D2:如何在DLL中显式实例化模板函数?

Templates D2:如何在DLL中显式实例化模板函数?,templates,dllexport,d,Templates,Dllexport,D,我有一个D2类型的模板函数: void AddToAry( InTy, AcTy )( in InTy[] InAry, ref AcTy[] AcAry ) { for( uint i=0; i<InAry.length; i++ ) AcAry[i] += InAry[i]; } 但是尝试编译会产生 AccumAry_DLL.d(37): Error: function AccumAry_DLL.AddToAry co

我有一个D2类型的模板函数:

void AddToAry( InTy, AcTy )( in InTy[] InAry,  ref AcTy[] AcAry )  {    

    for( uint i=0; i<InAry.length; i++ )  AcAry[i] += InAry[i];                     
}
但是尝试编译会产生

AccumAry_DLL.d(37): Error: function AccumAry_DLL.AddToAry conflicts with   template AccumAry_DLL.AddToAry(InTy,AcTy) at AccumAry_DLL.d (23)
如何告诉D2 dmd编译器实例化并从DLL导出适当类型的代码。。 或者可能需要使用D2 mixin模板

目前,我的工作是使用显式类型的代理函数。这样做 我将模板化的泛型函数重命名为not conflict,然后导出显式实例化的代理,如下所示:

export {  // Hopefuly these proxy functions will be "inlined", and ther is no real forwarding overhead.
    void AddToAry( in  float[] InAry,  ref  float[] AcAry )  { _AddToAry( InAry, AcAry ); }
    void AddToAry( in  float[] InAry,  ref double[] AcAry )  { _AddToAry( InAry, AcAry ); }
    void AddToAry( in double[] InAry,  ref double[] AcAry )  { _AddToAry( InAry, AcAry ); }
}  // end export
这是可行的,然后我问是否有办法确保D@compiler不会构造代理额外的转发开销?

我想

void AddToAry!(浮动,浮动)(浮动[],参考浮动[])

应该工作,类似C++。 您正试图声明非模板函数-它们的签名显然与您的模板冲突

注意:没有检查,现在只是猜测。

我想

void AddToAry!(浮动,浮动)(浮动[],参考浮动[])

应该工作,类似C++。 您正试图声明非模板函数-它们的签名显然与您的模板冲突


注意:没有检查,现在只是猜测。

确保内联发生的一个非常简单的方法是在这里简单地使用字符串mixin。(模板混合并不真正适用,因为它们引入声明,而您需要引入语句。)

private enum\u AddToAry=`for(size\u t i=0;i

请注意,这取决于参数命名是一致的。但是,如果您需要/想要更改它,您可以创建一个简单的函数,它接受参数的名称并返回一个适当的字符串。

确保内联发生的一个非常简单的方法就是在这里简单地使用字符串mixin。(模板混合并不真正适用,因为它们引入声明,而您需要引入语句。)

private enum\u AddToAry=`for(size\u t i=0;i
请注意,这取决于参数命名是一致的。但是,如果您需要/想要更改,可以创建一个简单的函数,该函数接受参数的名称并返回适当的字符串

export {  // Hopefuly these proxy functions will be "inlined", and ther is no real forwarding overhead.
    void AddToAry( in  float[] InAry,  ref  float[] AcAry )  { _AddToAry( InAry, AcAry ); }
    void AddToAry( in  float[] InAry,  ref double[] AcAry )  { _AddToAry( InAry, AcAry ); }
    void AddToAry( in double[] InAry,  ref double[] AcAry )  { _AddToAry( InAry, AcAry ); }
}  // end export
private enum _AddToAry = `for(size_t i = 0; i < InAry.length; i++)  AcAry[i] += InAry[i];`
extern 
{
    void AddToAry( in  float[] InAry,  ref  float[] AcAry )  { mixin(_AddToAry); }
    void AddToAry( in  float[] InAry,  ref double[] AcAry )  { mixin(_AddToAry); }
    void AddToAry( in double[] InAry,  ref double[] AcAry )  { mixin(_AddToAry); }
}