Using a struct as a wrapper for an extern(C) opaque type, no default constructor, what do?

Jeremy DeHaan via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 16 20:05:30 PST 2015


On Thursday, 17 December 2015 at 03:43:58 UTC, Jakob Ovrum wrote:
> On Thursday, 17 December 2015 at 03:31:37 UTC, Jeremy DeHaan 
> wrote:
>> Hi all. I'm interfacing to some C code which include an opaque 
>> type and some C functions that create and work with a pointer 
>> to that type. I want to wrap up everything in a struct, and 
>> the only thing that seems to bug me is initialization.
>>
>> Since it is C code, I obviously can't read the function that 
>> creates the opaque type. Not only that, I can't define a 
>> default constructor. What are my options here?
>>
>> This is for an API that is intended to be used by people other 
>> than myself, so I'd like to use something that doesn't look 
>> ugly or isn't a hack. I really don't like the idea of using a 
>> factory method or overriding opCall. Am I basically out of 
>> luck and need to resort to one of these methods?
>
> Using a factory function alongside @disable this(); is the 
> canonical way to do this. Although, if your struct is a 
> reference type, you can simply allow default construction and 
> have it mean a null reference.
>
> Using static opCall here is just a factory function with 
> special syntax, but I think it does more harm than good.

Thanks. I guess what bugs me is that I always try to hide the 
fact that the API is a wrapper around C stuff, ie, I want to make 
people feel as though they're using idiomatic D. Doing something 
like this makes it feel like less idiomatic D and more like a 
wrapper. I think I have a solution that I like in my own case 
though. Right now I'm considering something like this: 
http://dpaste.com/3FH3W13







More information about the Digitalmars-d-learn mailing list