Thread overview | ||||||
---|---|---|---|---|---|---|
|
September 19, 2015 Simple template constraint question | ||||
---|---|---|---|---|
| ||||
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 Re: Simple template constraint question | ||||
---|---|---|---|---|
| ||||
Posted in reply to WhatMeWorry | 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 Re: Simple template constraint question | ||||
---|---|---|---|---|
| ||||
Posted in reply to WhatMeWorry | 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 Re: Simple template constraint question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozak | 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)
|
Copyright © 1999-2021 by the D Language Foundation