Detect if a struct is a 3-float vector
Steven Schveighoffer
schveiguy at gmail.com
Wed Jun 23 22:54:46 UTC 2021
On 6/23/21 6:36 PM, JN wrote:
> I'm looking for a way to test a struct for these conditions:
>
> 1. has members named x, y and z
> 2. these members are floating point type
>
> This works, but feels kinda verbose, is there some shorter way? Can I
> somehow avoid the hasMember/getMember calls?
>
> ```d
> import std.traits;
>
> struct Vector3f
> {
> float x, y, z;
> }
>
> struct Vector2f
> {
> float x, y;
> }
>
> struct Vector3i
> {
> int x, y, z;
> }
>
> bool isVector3fType(T)()
> {
> static if (__traits(hasMember, T, "x") && __traits(hasMember, T,
> "y") && __traits(hasMember, T, "z"))
> {
> static if (isFloatingPoint!(typeof(__traits(getMember, T, "x")))
> && isFloatingPoint!(typeof(__traits(getMember, T, "y")))&&
> isFloatingPoint!(typeof(__traits(getMember, T, "z")))) {
> return true;
> }
> }
> return false;
> }
>
> void main()
> {
> static assert(isVector3fType!Vector3f);
> static assert(!isVector3fType!Vector2f);
> static assert(!isVector3fType!Vector3i);
> }
> ```
Hm.. what about:
```d
enum isVector3fType(T) = FieldNameTuple!T.length == 3 &&
FieldNameTuple!T == AliasSeq!("x", "y", "z") &&
allSatisfy!(isFloatingPoint, Fields!T);
```
(the length thing was required, otherwise the thing complained for Vector2f)
-Steve
More information about the Digitalmars-d-learn
mailing list