2012-01-17 7 views
2

IはD2型テンプレート機能を有する:D2:テンプレート化された関数をDLLで明示的にインスタンス化する方法は?

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

    for(uint i=0; i<InAry.length; i++) AcAry[i] += InAry[i];      
} 

私は明示的には、このコードを機能するように、異なる引数型の組み合わせについて、DLLによってエクスポート でインスタンス化することを望みます。

3つの準拠した機能の装飾でこれを行うには私の試みは...

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を確実にする方法がある場合は、私は聞いていますのよ@コンパイラは、プロキシの追加レベルの転送オーバーヘッドを構築しません。私は

void AddToAry!(float, float )(in float[], ref float[]);

とし

答えて

0

は、C++に似て動作するはずです。 テンプレート以外の関数を宣言しようとしています。その署名は明らかにテンプレートと衝突しています。

P.S.チェックされていない、ちょうど今推測している。

0

インライン化が確実に行われるようにする簡単な方法は、単にここで文字列mixinを使用することです。 (彼らは宣言を導入するので、あなたが声明を導入する必要がある一方、テンプレートのミックスインは、実際には適用されません。)これは、引数の命名に一貫性があるという事実に依存していることを

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); } 
} 

注意。ただし、変更する必要がある場合や変更したい場合は、引数の名前を取り、適切な文字列を返す単純な関数を作成できます。

関連する問題