Initializing defaults based on type.

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Mar 6 08:39:55 PST 2015


On 03/06/2015 08:04 AM, Benjamin Thaut wrote:
> On Friday, 6 March 2015 at 15:36:47 UTC, anon wrote:
>> Hi,
>>
>> I can't figure this out.
>>
>> struct Pair(T)
>> {
>>    T x;
>>    T y;
>>
>>    alias x c;
>>    alias y r;
>> }
>>
>> What would like is that the x and y to be initialized to different
>> values depending on type eg:
>>
>> struct Container
>> {
>>   Pair!double sample1; // This will initialize sample1 with 0 for both
>> x and y
>>   Pair!int    sample2; // This will initialize sample2 with 1 for both
>> x and y
>> }
>>
>> currently I'm using two different struct one with doubles and the
>> other with ints and initialized with default value but was wondering
>> if its possible to do the above.
>>
>> anon
>
> struct Pair(T)
> {
>   static if(is(T == int))
>     enum int initValue = 1;
>   else
>     enum T initValue = 0;
>
>     T x = initValue;
>     T y = initValue;
>
>     alias x c;
>     alias y r;
> }

Perhaps less cluttered:

enum PairInitValue(T : int) = 1;
enum PairInitValue(T : double) = 0;

struct Pair(T)
{
    T x = PairInitValue!T;
    T y = PairInitValue!T;

    alias x c;
    alias y r;
}

And an overengineered solution: :p

import std.typetuple;

alias PairInitValues = TypeTuple!(
     int, 1,
     double, 0,
);

string makePairInitValueDefinitions()
{
     import std.string;

     string result;

     foreach (i, e; PairInitValues) {
         static if (i % 2 == 0) {
             // This is a type
             result ~= format(`enum PairInitValue(T : %s) = `, e.stringof);

         } else {
             // this is a value
             result ~= format(`%s;`, e);
         }
     }

     return result;
}

mixin (makePairInitValueDefinitions());

struct Pair(T)
{
    T x = PairInitValue!T;
    T y = PairInitValue!T;

    alias x c;
    alias y r;
}

unittest
{
     auto p = Pair!int();
     assert(p.x == 1);
     assert(p.y == 1);
}

unittest
{
     auto p = Pair!double();
     assert(p.x == 0);
     assert(p.y == 0);
}

void main()
{}

Ali



More information about the Digitalmars-d-learn mailing list