C++ D编程:组件边界处的接口

C++ D编程:组件边界处的接口,c++,interface,d,C++,Interface,D,C++在很大程度上依赖C风格来导出和导入函数(如果有的话,不是类/接口),因此失去了面向对象的风格,这种风格在许多方面使导出的接口变得神秘 可以使用D编程语言以面向对象的方式导出接口。我能用C++接口包C++(纯)类吗?可能考虑的因素有哪些?这个方法可行。 < p>您可以找到关于D的C++互操作性谱的概述。 通过D的接口构造提供面向对象风格的互操作性: C++端 #include<iostream> class I // Our interface-by-convention {

C++在很大程度上依赖C风格来导出和导入函数(如果有的话,不是类/接口),因此失去了面向对象的风格,这种风格在许多方面使导出的接口变得神秘


可以使用D编程语言以面向对象的方式导出接口。我能用C++接口包C++(纯)类吗?可能考虑的因素有哪些?这个方法可行。

< p>您可以找到关于D的C++互操作性谱的概述。 通过D的
接口
构造提供面向对象风格的互操作性:

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);
}
<>代码>接口>代码> > >使界面布局复制一个继承C++ C++类中具有虚函数的单继承C++类的布局。p>

函数声明<代码> CealtEc/Cuff>中的相同属性使函数复制了在同伴C++编译器中等效函数的调用和调用约定。 配套编译器对:DMD/DMC++、GDC/g++、LDC/Clang。通过使用虚拟函数和用于直接函数调用的C ABI,通常可以与非配套编译器进行互操作

<>注意, CeATEC < /C>函数在C++中返回<>代码> I*<代码>,而在D中只是<代码> i>代码,这是因为D接口和类是隐式引用类型。

<>在更典型的真实世界使用中,<>代码> CealtCe>代码>函数比 Extn(C++)(然后C++中的代码>外部)C“< /Cuff>”更容易成为代码,编译器之间的互操作性更强,或者在使用DLL时更直接的运行时链接。
extern(C++)
目前有一些限制;目前无法告诉您,哪个名称空间是<代码>外部(C++)
声明,限制为只能链接到全局命名空间中的C++符号。
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
}