Templates D2:如何在DLL中显式实例化模板函数?
我有一个D2类型的模板函数: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
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); }
}