C++ pimpl

Martin Nowak dawg at dawgfoto.de
Sun Jan 22 16:49:39 PST 2012


On Mon, 23 Jan 2012 01:33:47 +0100, Timon Gehr <timon.gehr at gmx.ch> wrote:

> On 01/23/2012 01:07 AM, so wrote:
>> On Mon, 23 Jan 2012 01:39:23 +0200, so <so at so.so> wrote:
>>
>>> I have been asking that for some time now, i am afraid you won't get
>>> much of an audience.
>>> You can get rid of both additional allocation and indirection but it
>>> is not pretty. We could definitely use some help/sugar on this.
>>>
>>> http://www.artima.com/cppsource/backyard3.html
>>
>> http://www.digitalmars.com/d/archives/digitalmars/D/Implementation_hiding_139625.html
>>
>>
>> There is another issue Walter forgot to mention in the article.
>> I think there might be a way but looks like we also loose the  
>> "destructor".
>> Which means we are all the way back to the
>> http://en.wikipedia.org/wiki/Opaque_pointer.
>>
>> Walter, is there a way to get around destructor limitation?
>
> This seems to work.
>
> a.di:
>
> final class A{
>      private this();
>      static A factory();
>      T1 publicMember1(int x);
>      T2 publicMember2(float y);
>      T3 publicField;
>      // ...
> }
>
> a.d:
>
> class A{
>      static A factory(){return new A;}
>      T1 publicMember1(int x){ ... }
>      T2 publicMember2(float y){ ... }
>      T3 publicField;
>      // ...
> private:
>      T1 field1;
>      T2 field2;
> }
>
This will even work with plain new/this, as the allocation is done
in the constructor. The difficulty is that you can't build inheritable  
pimpls.


More information about the Digitalmars-d mailing list