2012-04-10 9 views
6

C++は、エクスポートおよびインポート関数に(関数があればクラス/インタフェースではない)Cスタイルに大きく依存しているため、エクスポートされたインタフェースをさまざまな方法で暗号化するオブジェクト指向の風味が失われます。Dプログラミング:コンポーネント境界でのインタフェース

オブジェクト指向のスタイルでインターフェイスをエクスポートするためにD言語を使用できます。 C++(純粋な)クラスをDインタフェースでラップすることはできますか?考慮すべき要素は何ですか?このアプローチは実現可能か?

答えて

5

DのC++相互運用性の範囲hereで概要を知ることができます。インタフェースのレイアウトは複製させるIインターフェイス上

C++側

#include<iostream> 

class I // Our interface-by-convention 
{ 
public: 
    virtual void foo() = 0; 

    void bar() // OK, non-virtual members do not affect binary compatibility 
    { 
     /* ... */ 
    } 
}; 

class C : public I 
{ 
private: 
    int a; 

public: 
    C(int a) : a(a) {} 

    void foo() 
    { 
     std::cout << a << std::endl; 
    } 
}; 

// This function will be used from the D side 
I* createC(int a) 
{ 
    return new C(a); 
} 

D側

extern(C++) interface I 
{ 
    void foo(); 

    final void bar() // OK, non-virtual members do not affect binary compatibility 
    { 
     /+ ... +/ 
    } 
} 

// Link `createC` from the C++ side 
extern(C++) I createC(int a); 

void main() 
{ 
    I i = createC(2); 
    i.foo(); // Write '2' to stdout 
} 

D'S extern(C++)

オブジェクト指向スタイルの相互運用性は、Dのinterface構築物を介して提供されます仮想関数を持つ単一継承C++クラスのレイアウト彼はコンパイラのC++コンパイラと一緒にいます。

関数宣言createCの同じ属性は、関数がコンパニオンC++コンパイラで同等の関数のマングリングと呼び出しの規則を複製するようにします。

コンパニオンペア:DMD/DMC++、GDC/g ++、LDC/Clang。直接関数呼び出しのために仮想関数とC ABIを使用することによって、非コンパイラコンパイラと相互運用することが可能です。

createC関数は、C++でI*を返し、IをDに返します。これは、Dインターフェイスとクラスが暗黙的に参照型であるためです。より一般的な実際の使用では、createC機能がextern(C++)よりextern(C)である可能性が高い

(その後、C++側のextern "C")、コンパイラの間の相互運用性のために、またはDLLを使用しているときのリンクよりストレートフォワードランタイム。

extern(C++)には現在いくつかの制限があります。現在のところ、extern(C++)宣言があるネームスペースをDに指定することはできません.Dをグローバル名前空間のC++シンボルにしかリンクできないように制限しています。