Thread overview
Template constraint: T is a value type
Oct 29, 2014
Gareth Foster
Oct 29, 2014
Rikki Cattermole
Oct 29, 2014
John Colvin
Oct 31, 2014
Jesse Phillips
October 29, 2014
Hi there,

I'm looking to write a function template that operates only on value types. Basically I'm looking for an equivalent of

  where T: struct

from C# (http://msdn.microsoft.com/en-us/library/d5x73970.aspx)

I was thinking that maybe using

  template Foo(T) if (is(T : struct) or is(T: union)) { ... }

or perhaps

  template Foo(T) if (!is(T : class)) { ... }

would be correct, but I fear the first may be too limiting (would simple data types such as int, char etc be allowed here? I'd guess not.) and the second may be too lax.

Any advice? Am I even going in remotely the right direction? Thanks.
October 29, 2014
On 29/10/2014 11:01 p.m., Gareth Foster wrote:
> Hi there,
>
> I'm looking to write a function template that operates only on value
> types. Basically I'm looking for an equivalent of
>
>    where T: struct
>
> from C# (http://msdn.microsoft.com/en-us/library/d5x73970.aspx)
>
> I was thinking that maybe using
>
>    template Foo(T) if (is(T : struct) or is(T: union)) { ... }
>
> or perhaps
>
>    template Foo(T) if (!is(T : class)) { ... }
>
> would be correct, but I fear the first may be too limiting (would simple
> data types such as int, char etc be allowed here? I'd guess not.) and
> the second may be too lax.
>
> Any advice? Am I even going in remotely the right direction? Thanks.

Code:
struct Foo {}
union Bar {}
class Fuz {}

pragma(msg, __traits(isPOD, Foo));
pragma(msg, __traits(isPOD, Bar));
pragma(msg, __traits(isPOD, Fuz));
pragma(msg, __traits(isPOD, int));

pragma(msg, is(Foo == struct));
pragma(msg, is(Bar == struct));
pragma(msg, is(Fuz == struct));
pragma(msg, is(int == struct));

pragma(msg, is(Foo == union));
pragma(msg, is(Bar == union));
pragma(msg, is(Fuz == union));
pragma(msg, is(int == union));

Output:
true
true
true
true
false
false
false
false
true
false
false

Dpaste link: http://dpaste.dzfl.pl/921fa5156290
So to answer your question, first was pretty much correct.
October 29, 2014
On Wednesday, 29 October 2014 at 10:01:18 UTC, Gareth Foster wrote:
> Hi there,
>
> I'm looking to write a function template that operates only on value types. Basically I'm looking for an equivalent of
>
>   where T: struct
>
> from C# (http://msdn.microsoft.com/en-us/library/d5x73970.aspx)
>
> I was thinking that maybe using
>
>   template Foo(T) if (is(T : struct) or is(T: union)) { ... }
>
> or perhaps
>
>   template Foo(T) if (!is(T : class)) { ... }
>
> would be correct, but I fear the first may be too limiting (would simple data types such as int, char etc be allowed here? I'd guess not.) and the second may be too lax.
>
> Any advice? Am I even going in remotely the right direction? Thanks.

std.traits.hasIndirections any use for you?
October 31, 2014
On Wednesday, 29 October 2014 at 11:49:59 UTC, John Colvin wrote:
> On Wednesday, 29 October 2014 at 10:01:18 UTC, Gareth Foster wrote:
>> Hi there,
>>
>> I'm looking to write a function template that operates only on value types. Basically I'm looking for an equivalent of
>>
>>  where T: struct
>>
>> from C# (http://msdn.microsoft.com/en-us/library/d5x73970.aspx)
>>
>> I was thinking that maybe using
>>
>>  template Foo(T) if (is(T : struct) or is(T: union)) { ... }
>>
>> or perhaps
>>
>>  template Foo(T) if (!is(T : class)) { ... }
>>
>> would be correct, but I fear the first may be too limiting (would simple data types such as int, char etc be allowed here? I'd guess not.) and the second may be too lax.
>>
>> Any advice? Am I even going in remotely the right direction? Thanks.
>
> std.traits.hasIndirections any use for you?

To more complete this:

    template Foo(T) if(!hasIndirections!T)

http://dlang.org/phobos/std_traits.html#hasIndirections