D编程语言中的Pimpl-idiom

Ral*_*zky 4 d pimpl-idiom

D拥有一个出色的模块系统,与C++相比,它可以大大缩短编译时间.根据文档,D仍然提供不透明的结构和联合,以便启用pimpl习语.我的问题是:如何在一个模块中声明嵌套结构(或联合)并在另一个模块中定义它?那是什么语法?

在C++中,标题看起来像这样

struct S { 
    ... 
    struct Impl; 
    Impl * p; 
};
Run Code Online (Sandbox Code Playgroud)

并且实现文件(cpp-file)将使用一些有趣的::-syntax,如下所示:

#include "header.h"
struct S::Impl { 
    ... 
};
Run Code Online (Sandbox Code Playgroud)

如何在D中实现相同的功能?

Vla*_*eev 5

D(至少DMD)使用.di文件进行声明.它们有点等同于C .h文件,但它们是可选的.D编译器可以.di自动生成文件(当-H指定开关时),虽然我相信目前所做的只是剥离函数体和单元测试.

这是使用.di文件实现PImpl的一种方法:

请注意,目前您有责任确保和文件中的字段S相同- 如果它们不同,编译后的模块将对字段的布局方式有不同的了解,这可能会导致内存损坏.当前的编译器实现不验证定义是否与文件匹配..d.di.d.di