www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - how do I check if a member of a T has a member ?

reply Laeeth Isharc <spamnolaeeth nospamlaeeth.com> writes:
can I check if a member of a T has a member without using a mixin?

hid_t createDataType(T)()
if (__traits(isSame, TemplateOf!(T), PriceBar))
{
	auto tid=H5T.create(H5TClass.Compound,T.sizeof);
	enum offsetof(alias type, string field) = mixin(type.stringof 
~"."~field~".offsetof");
	H5T.insert(tid, "date", offsetof!(T,"date"), 
createDataType!(KalDate));
	static if(hasMember!(T,"open"))
		H5T.insert(tid,"open",offsetof!(T,"open"),mapDtoHDF5Type("double"));
}

I would like to check if date has a member called second.

Thanks.
Sep 13 2015
parent reply wobbles <grogan.colin gmail.com> writes:
On Sunday, 13 September 2015 at 16:46:54 UTC, Laeeth Isharc wrote:
 can I check if a member of a T has a member without using a 
 mixin?

 hid_t createDataType(T)()
 if (__traits(isSame, TemplateOf!(T), PriceBar))
 {
 	auto tid=H5T.create(H5TClass.Compound,T.sizeof);
 	enum offsetof(alias type, string field) = mixin(type.stringof 
 ~"."~field~".offsetof");
 	H5T.insert(tid, "date", offsetof!(T,"date"), 
 createDataType!(KalDate));
 	static if(hasMember!(T,"open"))
 		H5T.insert(tid,"open",offsetof!(T,"open"),mapDtoHDF5Type("double"));
 }

 I would like to check if date has a member called second.

 Thanks.
Use __traits(compiles, date.second)?
Sep 13 2015
parent reply Laeeth Isharc <spamnolaeeth nospamlaeeth.com> writes:
On Sunday, 13 September 2015 at 17:09:57 UTC, wobbles wrote:
 Use __traits(compiles, date.second)?
Thanks. This works: static if (__traits(compiles, { T bar; bar.date.hour;})) pragma(msg,"hour"); else pragma(msg,"nohour");
Sep 13 2015
parent reply BBasile <bb.temp gmx.com> writes:
On Sunday, 13 September 2015 at 17:24:20 UTC, Laeeth Isharc wrote:
 On Sunday, 13 September 2015 at 17:09:57 UTC, wobbles wrote:
 Use __traits(compiles, date.second)?
Thanks. This works: static if (__traits(compiles, { T bar; bar.date.hour;})) pragma(msg,"hour"); else pragma(msg,"nohour");
can't you use 'hasMember' (either with __traits() or std.traits.hasMember)? It's more idiomatic than checking if it's compilable.
Sep 13 2015
parent reply Laeeth Isharc <spamnolaeeth nospamlaeeth.com> writes:
On Sunday, 13 September 2015 at 17:34:11 UTC, BBasile wrote:
 On Sunday, 13 September 2015 at 17:24:20 UTC, Laeeth Isharc 
 wrote:
 On Sunday, 13 September 2015 at 17:09:57 UTC, wobbles wrote:
 Use __traits(compiles, date.second)?
Thanks. This works: static if (__traits(compiles, { T bar; bar.date.hour;})) pragma(msg,"hour"); else pragma(msg,"nohour");
can't you use 'hasMember' (either with __traits() or std.traits.hasMember)? It's more idiomatic than checking if it's compilable.
I'll check again in a bit, but I seem to recall hasMember didn't work. I would like to get the type of a member of a type, and I think hasMember!(T.bar.date","hour") didn't work for that. Possibly it does work and I messed it up somehow, or it doesn't work and there is a more elegant way. Someone ought to write a tutorial showing how to use the good stuff we have to solve real problems. Eg an annotated babysteps version of Andrei's allocator talk. I can't do it as too much on my plate.
Sep 14 2015
parent reply John Colvin <john.loughran.colvin gmail.com> writes:
On Monday, 14 September 2015 at 14:05:01 UTC, Laeeth Isharc wrote:
 On Sunday, 13 September 2015 at 17:34:11 UTC, BBasile wrote:
 On Sunday, 13 September 2015 at 17:24:20 UTC, Laeeth Isharc 
 wrote:
 [...]
can't you use 'hasMember' (either with __traits() or std.traits.hasMember)? It's more idiomatic than checking if it's compilable.
I'll check again in a bit, but I seem to recall hasMember didn't work. I would like to get the type of a member of a type, and I think hasMember!(T.bar.date","hour") didn't work for that. Possibly it does work and I messed it up somehow, or it doesn't work and there is a more elegant way.
You mean hasMember!(typeof(T.bar.date), "hour"), right?
Sep 14 2015
parent reply Laeeth Isharc <spamnolaeeth nospamlaeeth.com> writes:
On Monday, 14 September 2015 at 14:21:12 UTC, John Colvin wrote:
 On Monday, 14 September 2015 at 14:05:01 UTC, Laeeth Isharc 
 wrote:
 On Sunday, 13 September 2015 at 17:34:11 UTC, BBasile wrote:
 On Sunday, 13 September 2015 at 17:24:20 UTC, Laeeth Isharc 
 wrote:
 [...]
can't you use 'hasMember' (either with __traits() or std.traits.hasMember)? It's more idiomatic than checking if it's compilable.
I'll check again in a bit, but I seem to recall hasMember didn't work. I would like to get the type of a member of a type, and I think hasMember!(T.bar.date","hour") didn't work for that. Possibly it does work and I messed it up somehow, or it doesn't work and there is a more elegant way.
You mean hasMember!(typeof(T.bar.date), "hour"), right?
Ahh. Probably that was why (I will check it shortly). Why do I need to do a typeof? What kind of thing is T.bar.date before the typeof given that T is a type?
Sep 14 2015
parent John Colvin <john.loughran.colvin gmail.com> writes:
On Monday, 14 September 2015 at 15:04:00 UTC, Laeeth Isharc wrote:
 On Monday, 14 September 2015 at 14:21:12 UTC, John Colvin wrote:
 On Monday, 14 September 2015 at 14:05:01 UTC, Laeeth Isharc 
 wrote:
 On Sunday, 13 September 2015 at 17:34:11 UTC, BBasile wrote:
 On Sunday, 13 September 2015 at 17:24:20 UTC, Laeeth Isharc 
 wrote:
 [...]
can't you use 'hasMember' (either with __traits() or std.traits.hasMember)? It's more idiomatic than checking if it's compilable.
I'll check again in a bit, but I seem to recall hasMember didn't work. I would like to get the type of a member of a type, and I think hasMember!(T.bar.date","hour") didn't work for that. Possibly it does work and I messed it up somehow, or it doesn't work and there is a more elegant way.
You mean hasMember!(typeof(T.bar.date), "hour"), right?
Ahh. Probably that was why (I will check it shortly). Why do I need to do a typeof? What kind of thing is T.bar.date before the typeof given that T is a type?
T.bar.date is just a symbol. If you tried to actually access it then it would have to be a compile-time construct or be a static member/method, but it's perfectly OK to ask what type it has or what size it has. The simple story: hasMember takes a type as its first argument. T.bar.date isn't a type, it's a member of a member of a type. To find out what type it is, use typeof.
Sep 14 2015