www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Implicit conversion of struct to bool for if (s) operation ?

reply chmike <christophe meessen.net> writes:
Hello,

I have a structure with two fields ad defined as

struct Info {
     this(int value, Category category)
     {
         category_ = category;
         value_ = category ? value : 0;
     }
     ...
private:
     Category category_ = null;
     int value_ = 0;
}


I would like an implicit conversion of Info to bool that return 
false if category_ is null so that I can write

Info s = foo();
if (s) {
    ...
}

and where

Info s2;
assert(!s2);
Jun 06 2016
next sibling parent reply John <johnch_atms hotmail.com> writes:
On Monday, 6 June 2016 at 15:23:50 UTC, chmike wrote:
 Hello,

 I have a structure with two fields ad defined as

 struct Info {
     this(int value, Category category)
     {
         category_ = category;
         value_ = category ? value : 0;
     }
// This converts implicitly to bool. T opCast(T : bool)() { return category_ !is null; }
     ...
 private:
     Category category_ = null;
     int value_ = 0;
 }


 I would like an implicit conversion of Info to bool that return 
 false if category_ is null so that I can write

 Info s = foo();
 if (s) {
    ...
 }

 and where

 Info s2;
 assert(!s2);
See the inserted code above.
Jun 06 2016
parent reply chmike <christophe meessen.net> writes:
On Monday, 6 June 2016 at 15:28:35 UTC, John wrote:
Thank you John and Adam. That was a quick answer !
Jun 06 2016
parent Basile B. <b2.temp gmx.com> writes:
On Monday, 6 June 2016 at 15:34:18 UTC, chmike wrote:
 On Monday, 6 June 2016 at 15:28:35 UTC, John wrote:
 Thank you John and Adam. That was a quick answer !
Too late but another option would have been to put an alias this on a bool getter: struct Info { bool getStuff() { return true; } alias getStuff this; }
Jun 07 2016
prev sibling parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Monday, 6 June 2016 at 15:23:50 UTC, chmike wrote:
 I would like an implicit conversion of Info to bool that return 
 false if category_ is null so that I can write
add: bool opCast(T : bool)() { return whatever; } to the struct and it should work.
Jun 06 2016
parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 06/06/2016 08:28 AM, Adam D. Ruppe wrote:
 On Monday, 6 June 2016 at 15:23:50 UTC, chmike wrote:
 I would like an implicit conversion of Info to bool that return false
 if category_ is null so that I can write
add: bool opCast(T : bool)() { return whatever; } to the struct and it should work.
It's news to me that while opCast for all other types is for explicit casting, opCast for bool works for implicit casting. Ali
Jun 07 2016
parent reply Steven Schveighoffer <schveiguy yahoo.com> writes:
On 6/7/16 6:15 PM, Ali Çehreli wrote:
 On 06/06/2016 08:28 AM, Adam D. Ruppe wrote:
 On Monday, 6 June 2016 at 15:23:50 UTC, chmike wrote:
 I would like an implicit conversion of Info to bool that return false
 if category_ is null so that I can write
add: bool opCast(T : bool)() { return whatever; } to the struct and it should work.
It's news to me that while opCast for all other types is for explicit casting, opCast for bool works for implicit casting.
as ag0... mentioned in another thread, opCast is NOT implicitly being invoked here, but rather explicitly. That is: bool x = someStruct; // error if(someStruct) // explicit opCast!bool -Steve
Jun 07 2016
parent Mike Parker <aldacron gmail.com> writes:
On Tuesday, 7 June 2016 at 22:28:57 UTC, Steven Schveighoffer 
wrote:
 It's news to me that while opCast for all other types is for 
 explicit
 casting, opCast for bool works for implicit casting.
as ag0... mentioned in another thread, opCast is NOT implicitly being invoked here, but rather explicitly. That is: bool x = someStruct; // error if(someStruct) // explicit opCast!bool
Documented under 'Boolean Operations' at http://dlang.org/spec/operatoroverloading.html#cast
Jun 07 2016