PIMPL Idiom in D
Steven Schveighoffer
schveiguy at yahoo.com
Mon May 21 21:41:55 UTC 2018
On 5/21/18 5:23 PM, Walter Bright wrote:
> In C, the way to do PIMPL is to write just a struct declaration:
>
> === s.h ===
> struct S;
>
> === s.c ===
> #include "s.h"
> struct S { ... };
>
> === t.c ===
> #include "s.h"
> struct T {
> S* pimpl;
> };
>
> And the users of T cannot access anything in S. The straightforward
> equivalent in D is:
>
> === s.di ===
> struct S;
>
> === s.d ===
> struct S { ... }
>
> === t.d ===
> import s;
> struct T {
> S* pimpl;
> };
>
>
> But if you don't want to use .di files, such as when compiling all the
> files together with one command, then things get a bit awkward. D
> doesn't like:
>
> === s.d ===
> public struct S;
> private struct S { ... }
>
> Making a public alias to a private struct doesn't work, as the struct's
> members are still accessible. I finally found a way:
>
> === s.d ===
> public struct Spimpl {
> private S* pimpl;
> private alias pimpl this;
> }
> private struct S { ... }
>
> === t.d ===
> import s;
> struct T {
> Spimpl* s;
Don't you mean a nonpointer here? Otherwise, there are 2 indirections
needed.
> }
>
> and the contents of S are inaccessible to T, while type safety is
> maintained. There are no extra indirections - the alias this takes care
> of that. s.d can use s to directly access S's contents, but t.d cannot.
>
> https://github.com/dlang/dmd/blob/master/src/dmd/func.d#L229
> https://github.com/dlang/dmd/blob/master/src/dmd/dinterpret.d#L151
>
> C: http://wiki.c2.com/?PimplIdiom
> C++: http://en.cppreference.com/w/cpp/language/pimpl
Will this really work?
I mean, if the compiler can see the implementation of S, even though
it's private, can't it inline things and screw with the binary
compatibility?
I thought that was the main benefit of pimpl, to create a barrier which
you know is going to separate the user from the implementation.
-Steve
More information about the Digitalmars-d
mailing list