Thread overview
Simple template constraint question
Sep 19, 2015
WhatMeWorry
Sep 19, 2015
Daniel Kozak
Sep 19, 2015
WhatMeWorry
Sep 19, 2015
anonymous
September 19, 2015
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;
}
September 19, 2015
WhatMeWorry píše v So 19. 09. 2015 v 17:09 +0000:
> 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;
> }

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
}

September 19, 2015
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.
September 19, 2015
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)