C++ operator overloading to D

Bill Baxter dnewsgroup at billbaxter.com
Sat Sep 22 15:50:30 PDT 2007


BLS wrote:
> Bill Baxter schrieb:
>> BLS wrote:
>>> Hi,
>>> I have a small problem in translating C++ operator overloading to D
>>>
>>> // Allready translated C++ stuff
>>> class CFont
>>> {
>>> public:
>>>   HFONT m_hFont;
>>>
>>>   this(HFONT hFont = NULL)
>>>   {
>>>     m_hFont = hFont;
>>>   }
>>>   ~this()
>>>   {
>>>     if(m_hFont !is NULL && !DeleteObject(m_hFont))
>>>     m_hFont = NULL;
>>>   }
>>>
>>> // TODO How to translate this C++ construct  into D
>>>
>>>     operator HFONT() {return m_hFont;}
>>>
>>> // That's the problem.
>>>
>>> Sorry have  not found anything related in the docs.
>>> Some ideas;;; Many thanks in advance.
>>> Bjoern
>>
>> Basically you can't until D gets something like opImplicitCast.
>>
>> What that does is allow the CFont class to be used in contexts where 
>> an HFONT is expected.
>>
>> so you need to make it into a function that explicity does the cast. 
>> Such as:
>>
>>      HFONT hfont() {return m_hFont;}
>>
>> or name it to_HFONT() or as_hfont() or whatever tickles your fancy.
> 
> Sorry, I don't understand. But before I ask for more information, I'll 
> study the C++ code again.

operator SOMETYPE() in C++ is a casting/conversion operator.
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=24&rl=1

So with your example, given some API like
   SetFont(HFONT font);

That operator HFONT makes it so you can pass a CFont to that function as 
if it were an HFONT.

    CFont mycfont;
    ...
    SetFont(mycfont);
      // first calls operator HFONT() and passes result to SetFont

>> This is one of the bigger pains of translating C++ code to D -- the 
>> repercussions of not having something like opImplicitCast.  Chances 
>> are the original code will be passing CFonts around as HFONTS 
>> willy-nilly. So you're going to have to add a lot of ".hfont"s  here 
>> and there to make the translated code compile.
>>
>>
>> --bb
> Ouch!
> Any plans for opImplicitCast in D 2 ?

Apparently so according to WalterAndrei.pdf.

> A bit off topic
> Bill, you have just translated a huge C++ project. Can you tell us a bit 
>  about your experience, problems, tricks ...probabely on D WIKI.

I was thinking about it, but I wasn't sure if anyone would be interested.

> I am going to translate about 15000 LOC (99 percent template free, 
> thanks man) and I know about at least 2 guys working on bigger C++ to D 
> projects. I have allready suggested to open a new forum "porting C++" 
> but the feedback was not really enthusiastic, to say the least.

To me the D newsgroup is a fine place to discuss porting issues.  And a 
wiki with advice would be nice -- especially for people who want to port 
something but don't really know C++ that well to begin with.

> However, I am pretty sure that information regarding porting C++ to D is 
> a matter of interest.

Well, if you think so I can jot down some of my observations about 
porting from C++ to D on wiki4d.

--bb


More information about the Digitalmars-d-learn mailing list