【发布时间】:2012-02-11 22:56:56
【问题描述】:
我有一个 D2 类型的模板函数:
void AddToAry( InTy, AcTy )( in InTy[] InAry, ref AcTy[] AcAry ) {
for( uint i=0; i<InAry.length; i++ ) AcAry[i] += InAry[i];
}
我希望显式实例化它,以便此函数代码为 由 DLL 导出,用于不同的 arg 类型组合。
我尝试使用三个一致的函数装饰来做到这一点..
export {
void AddToAry( float, float );
void AddToAry( float, double );
void AddToAry( double, double );
}
但是尝试编译会产生..
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 模板来代替?
现在我的工作是使用显式类型的代理函数。这样做 我将模板化的泛型函数重命名为不冲突,然后像这样导出显式实例化的代理:
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@ 编译器不会构造代理的额外转发开销级别?
【问题讨论】: