digitalmars.D.learn - "operator" overloading?
- %u (13/13) Feb 23 2011 Hi everyone,
- Dmitry Olshansky (20/33) Feb 23 2011 Something like this, and i shouldn't be a class in D (it's a proxy sort...
- Simon (10/45) Feb 23 2011 That's the wrong way round.
- Simon (7/48) Feb 23 2011 Nuts never mind. I'm talking out my ass.
- Dmitry Olshansky (22/68) Feb 23 2011 There is no much point in getting closer to the source I think.
- Jonathan M Davis (7/56) Feb 23 2011 You can overload the cast operator in D:
- Simon (5/11) Feb 23 2011 thanks for the info; and Dmitry.
- %u (1/1) Feb 23 2011 Thaks to everyone for your assistance.
Hi everyone, Was hoping someone could help me make sense of this bit of C++ code: class canvas { operator HDC() { return _hdc; } protected: canvas(HDC hdc): _hdc(hdc) {} HDC _hdc; } From what I understand, HDC is an alias for HANDLE in Windows. So they are overloading canvas such that when assigned to handle instance it returns _hdc? How is this done in D? Thanks
Feb 23 2011
On 23.02.2011 17:08, %u wrote:Hi everyone, Was hoping someone could help me make sense of this bit of C++ code: class canvas { operator HDC() { return _hdc; } protected: canvas(HDC hdc): _hdc(hdc) {} HDC _hdc; } From what I understand, HDC is an alias for HANDLE in Windows. So they are overloading canvas such that when assigned to handle instance it returns _hdc? How is this done in D? ThanksSomething like this, and i shouldn't be a class in D (it's a proxy sort of, right? ) : struct canvas{ alias getHandle this; this(HDC hdc){ _hdc = hdc; } property HDC getHandle(){ return _hdc; } private: HDC _hdc; } uinttest{ HDC h = cast(HDC)1; canvas c = h;//intitalize h = c; assert(h == c); } -- Dmitry Olshansky
Feb 23 2011
On 23/02/2011 14:37, Dmitry Olshansky wrote:On 23.02.2011 17:08, %u wrote:That's the wrong way round. The c++ class is a canvas object which can be transparently passed to any windows function which takes a HDC. Note the constructor is protected and the cast operator is public. Not sure of the cast operator details in D though; I've never used it myself. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.ukHi everyone, Was hoping someone could help me make sense of this bit of C++ code: class canvas { operator HDC() { return _hdc; } protected: canvas(HDC hdc): _hdc(hdc) {} HDC _hdc; } From what I understand, HDC is an alias for HANDLE in Windows. So they are overloading canvas such that when assigned to handle instance it returns _hdc? How is this done in D? ThanksSomething like this, and i shouldn't be a class in D (it's a proxy sort of, right? ) : struct canvas{ alias getHandle this; this(HDC hdc){ _hdc = hdc; } property HDC getHandle(){ return _hdc; } private: HDC _hdc; } uinttest{ HDC h = cast(HDC)1; canvas c = h;//intitalize h = c; assert(h == c); }
Feb 23 2011
On 23/02/2011 18:42, Simon wrote:On 23/02/2011 14:37, Dmitry Olshansky wrote:Nuts never mind. I'm talking out my ass. Though how do you do it using the cast operator? That would be closer to the c++ implementation. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.ukOn 23.02.2011 17:08, %u wrote:That's the wrong way round.Hi everyone, Was hoping someone could help me make sense of this bit of C++ code: class canvas { operator HDC() { return _hdc; } protected: canvas(HDC hdc): _hdc(hdc) {} HDC _hdc; } From what I understand, HDC is an alias for HANDLE in Windows. So they are overloading canvas such that when assigned to handle instance it returns _hdc? How is this done in D? ThanksSomething like this, and i shouldn't be a class in D (it's a proxy sort of, right? ) : struct canvas{ alias getHandle this; this(HDC hdc){ _hdc = hdc; } property HDC getHandle(){ return _hdc; } private: HDC _hdc; } uinttest{ HDC h = cast(HDC)1; canvas c = h;//intitalize h = c; assert(h == c); }
Feb 23 2011
On 23.02.2011 21:48, Simon wrote:On 23/02/2011 18:42, Simon wrote:There is no much point in getting closer to the source I think. Well, there sort of was opImplicitCast, but it's functionality is superseded by alias this. When multiple alias this are implemented and some bugs fixed we are sure to witness it's full power. Meanwhile you could just as well make this proxy a template struct: struct proxy(T){ alias getHandle this; this(T handle){ _h = handle; } property T getHandle(){ return _h; } private: T _h; } alias proxy!(HDC) canvas; //and so on and so forth But this sort of thin wrappers are of no good if they do not provide you some benefits like automatic resource management and such. -- Dmitry OlshanskyOn 23/02/2011 14:37, Dmitry Olshansky wrote:Nuts never mind. I'm talking out my ass. Though how do you do it using the cast operator? That would be closer to the c++ implementation.On 23.02.2011 17:08, %u wrote:That's the wrong way round.Hi everyone, Was hoping someone could help me make sense of this bit of C++ code: class canvas { operator HDC() { return _hdc; } protected: canvas(HDC hdc): _hdc(hdc) {} HDC _hdc; } From what I understand, HDC is an alias for HANDLE in Windows. So they are overloading canvas such that when assigned to handle instance it returns _hdc? How is this done in D? ThanksSomething like this, and i shouldn't be a class in D (it's a proxy sort of, right? ) : struct canvas{ alias getHandle this; this(HDC hdc){ _hdc = hdc; } property HDC getHandle(){ return _hdc; } private: HDC _hdc; } uinttest{ HDC h = cast(HDC)1; canvas c = h;//intitalize h = c; assert(h == c); }
Feb 23 2011
On Wednesday, February 23, 2011 10:42:04 Simon wrote:On 23/02/2011 14:37, Dmitry Olshansky wrote:You can overload the cast operator in D: T opCast(T)() {...} but it's for explicit cast only. There is not currently any way to do implicit casts with an overloaded operator. You have to use alias this for that, which may or may not do what be what you want if you want an implicit cast. - Jonathan M DavisOn 23.02.2011 17:08, %u wrote:That's the wrong way round. The c++ class is a canvas object which can be transparently passed to any windows function which takes a HDC. Note the constructor is protected and the cast operator is public. Not sure of the cast operator details in D though; I've never used it myself.Hi everyone, Was hoping someone could help me make sense of this bit of C++ code: class canvas { operator HDC() { return _hdc; } protected: canvas(HDC hdc): _hdc(hdc) {} HDC _hdc; } From what I understand, HDC is an alias for HANDLE in Windows. So they are overloading canvas such that when assigned to handle instance it returns _hdc? How is this done in D? ThanksSomething like this, and i shouldn't be a class in D (it's a proxy sort of, right? ) : struct canvas{ alias getHandle this; this(HDC hdc){ _hdc = hdc; } property HDC getHandle(){ return _hdc; } private: HDC _hdc; } uinttest{ HDC h = cast(HDC)1; canvas c = h;//intitalize h = c; assert(h == c); }
Feb 23 2011
On 23/02/2011 19:56, Jonathan M Davis wrote:You can overload the cast operator in D: T opCast(T)() {...} but it's for explicit cast only. There is not currently any way to do implicit casts with an overloaded operator. You have to use alias this for that, which may or may not do what be what you want if you want an implicit cast. - Jonathan M Davisthanks for the info; and Dmitry. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk
Feb 23 2011