www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Simple template constraint question

reply WhatMeWorry <kheaser gmail.com> writes:
Does D provide complete template constraint granularity?

In other words, I want to only accept structs in the template 
below.
I've find the isAggregateType which is close but no cigar. Am I 
missing
some other filters?

And a more open ended question.  Is there a more elegant solution 
for the
below function?  Maybe a one-liner?  I have a knack for making 
simple solutions
complex :)



// Calculate the number of components for openGL generic
// vertex attribute. Must be 1, 2, 3, 4.

// isAggregateType constraint accepts class, union, struct, and 
interface

int getNumberComponents(T)(T someStruct) if (isAggregateType!(T))
{
     int members = 0;
     foreach (i, member; someStruct.tupleof)
     {
         //writefln("Member %s:", i);
         //writefln("  type : %s", typeof(member).stringof);
         //writefln("  value: %s", member);
         members++;
     }
     return members;
}
Sep 19 2015
next sibling parent reply Daniel Kozak <kozzi dlang.cz> writes:
WhatMeWorry p=C3=AD=C5=A1e v So 19. 09. 2015 v 17:09 +0000:
 Does D provide complete template constraint granularity?
=20
 In other words, I want to only accept structs in the template=20
 below.
 I've find the isAggregateType which is close but no cigar. Am I=20
 missing
 some other filters?
=20
 And a more open ended question.  Is there a more elegant solution=20
 for the
 below function?  Maybe a one-liner?  I have a knack for making=20
 simple solutions
 complex :)
=20
=20
=20
 // Calculate the number of components for openGL generic
 // vertex attribute. Must be 1, 2, 3, 4.
=20
 // isAggregateType constraint accepts class, union, struct, and=20
 interface
=20
 int getNumberComponents(T)(T someStruct) if (isAggregateType!(T))
 {
      int members =3D 0;
      foreach (i, member; someStruct.tupleof)
      {
          //writefln("Member %s:", i);
          //writefln("  type : %s", typeof(member).stringof);
          //writefln("  value: %s", member);
          members++;
      }
      return members;
 }
http://dlang.org/expression.html#IsExpression 3. is ( Type =3D=3D TypeSpecialization ) import std.stdio; struct S { } class C { } void f(T)(T someStruct) if (is (T =3D=3D struct)) { writeln("struct"); } void f(T)(T notStruct) if (!is(T =3D=3D struct)) { writeln("not a struct"); } void main() { auto c =3D new C(); auto s =3D S(); f(c); // not a struct f(s); // struct }
Sep 19 2015
parent WhatMeWorry <kheaser gmail.com> writes:
On Saturday, 19 September 2015 at 17:18:23 UTC, Daniel Kozak 
wrote:
 WhatMeWorry píše v So 19. 09. 2015 v 17:09 +0000:
 [...]
http://dlang.org/expression.html#IsExpression 3. is ( Type == TypeSpecialization ) import std.stdio; struct S { } class C { } void f(T)(T someStruct) if (is (T == struct)) { writeln("struct"); } void f(T)(T notStruct) if (!is(T == struct)) { writeln("not a struct"); } void main() { auto c = new C(); auto s = S(); f(c); // not a struct f(s); // struct }
Thanks! I keep going straight to std.traits and forget about the is(Type)
Sep 19 2015
prev sibling parent anonymous <anonymous example.com> writes:
On Saturday 19 September 2015 19:09, WhatMeWorry wrote:

 And a more open ended question.  Is there a more elegant solution 
 for the
 below function?  Maybe a one-liner?  I have a knack for making 
 simple solutions
 complex :)
 
 
 
 // Calculate the number of components for openGL generic
 // vertex attribute. Must be 1, 2, 3, 4.
 
 // isAggregateType constraint accepts class, union, struct, and 
 interface
 
 int getNumberComponents(T)(T someStruct) if (isAggregateType!(T))
 {
      int members = 0;
      foreach (i, member; someStruct.tupleof)
      {
          //writefln("Member %s:", i);
          //writefln("  type : %s", typeof(member).stringof);
          //writefln("  value: %s", member);
          members++;
      }
      return members;
 }
If the whole goal is to get how many members T has: ---- template getNumberComponents(T) if (is(T == struct)) { enum getNumberComponents = T.tupleof.length; } ---- Or you can write `T.tupleof.length` directly, of course.
Sep 19 2015