Re: Can't print enum values

2018-08-31 Thread Andrey via Digitalmars-d-learn

On Friday, 31 August 2018 at 12:21:48 UTC, aliak wrote:

auto ToUnderlyingType(alias a)() {
return cast(OriginalType!(typeof(a)))a;
}

void print(T...)(T args) {
writeln(staticMap!(ToUnderlyingType, args));
}



Oohhh. So easy! Killed 2 days - and templates and mixins tried... 
And the solution was to use TEMPLATE function with alias not 
regular...

Thank you!


Re: Can't print enum values

2018-08-31 Thread aliak via Digitalmars-d-learn

On Friday, 31 August 2018 at 10:51:51 UTC, Andrey wrote:

On Thursday, 30 August 2018 at 12:04:26 UTC, vit wrote:

On Thursday, 30 August 2018 at 11:34:36 UTC, Andrey wrote:

On Thursday, 30 August 2018 at 11:09:40 UTC, vit wrote:

[...]


I want to create a reusable template for this purpose.
Why I can't use "staticMap" so that compiler it self would do 
this:

[...]
Just wrap some some symbol "args" with some expression at 
compile time.


It is the same as in C++:

[...]


D doesn't have expanding like C++

Unfortunately D has only simple automatic expading.


So how can one implement a reusable template "apply some 
function to each argument in template parameter pack" in D?


auto ToUnderlyingType(alias a)() {
return cast(OriginalType!(typeof(a)))a;
}

void print(T...)(T args) {
writeln(staticMap!(ToUnderlyingType, args));
}


Re: Can't print enum values

2018-08-31 Thread Andrey via Digitalmars-d-learn

On Thursday, 30 August 2018 at 12:04:26 UTC, vit wrote:

On Thursday, 30 August 2018 at 11:34:36 UTC, Andrey wrote:

On Thursday, 30 August 2018 at 11:09:40 UTC, vit wrote:

[...]


I want to create a reusable template for this purpose.
Why I can't use "staticMap" so that compiler it self would do 
this:

[...]
Just wrap some some symbol "args" with some expression at 
compile time.


It is the same as in C++:

[...]


D doesn't have expanding like C++

Unfortunately D has only simple automatic expading.


So how can one implement a reusable template "apply some function 
to each argument in template parameter pack" in D?


Re: Can't print enum values

2018-08-30 Thread vit via Digitalmars-d-learn

On Thursday, 30 August 2018 at 11:34:36 UTC, Andrey wrote:

On Thursday, 30 August 2018 at 11:09:40 UTC, vit wrote:

[...]


I want to create a reusable template for this purpose.
Why I can't use "staticMap" so that compiler it self would do 
this:

[...]
Just wrap some some symbol "args" with some expression at 
compile time.


It is the same as in C++:

[...]


D doesn't have expanding like C++

Unfortunately D has only simple automatic expading.


Re: Can't print enum values

2018-08-30 Thread Andrey via Digitalmars-d-learn

On Thursday, 30 August 2018 at 11:09:40 UTC, vit wrote:

args are runtime arguments.

import std.experimental.all;

enum MyEnum : string
{
First = "F_i_r_s_t",
Second = "S_e_c_o_n_d"
}

///alias QW(alias arg) = 
Alias!(cast(OriginalType!(typeof(arg)))arg);

auto QW(T)(const auto ref T x){
return cast(OriginalType!T)x;
}

void print(T...)(T args)
{
writeln(cast(OriginalType!(typeof(args[0])))args[0]); // 
Works...
///writeln(QW!(args[0]));// 
Doesn't work... MUST!

writeln(QW(args[0]));

static foreach(alias arg; args){
static if(is(typeof(arg) : MyEnum))write(QW(arg));
else write(arg);
}
write('\n');
//writeln(staticMap!(QW, args));// 
Doesn't work... MUST!

}

void main()
{
bool runTimeBool = true;
print(MyEnum.First, 7, runTimeBool, MyEnum.Second);
}


I want to create a reusable template for this purpose.
Why I can't use "staticMap" so that compiler it self would do 
this:

void print(T...)(T args)
{
   writeln(cast(OriginalType!(typeof(args[0])))args[0], 
cast(OriginalType!(typeof(args[1])))args[1], 
cast(OriginalType!(typeof(args[2])))args[2], 
cast(OriginalType!(typeof(args[3])))args[3]);

}
Just wrap some some symbol "args" with some expression at compile 
time.


It is the same as in C++:

template
void print(Args ...args)
{
   writeln(UnderlyingType(args)...); // UnderlyingType is a 
function here

}


Re: Can't print enum values

2018-08-30 Thread vit via Digitalmars-d-learn

On Thursday, 30 August 2018 at 10:41:58 UTC, Andrey wrote:

Hello,
This code doesn't print enum values:

import std.meta;
import std.traits;
import std.stdio;

enum MyEnum : string
{
   First = "F_i_r_s_t",
   Second = "S_e_c_o_n_d"
}

alias QW(alias arg) = 
Alias!(cast(OriginalType!(typeof(arg)))arg);


void print(T...)(T args)
{
   writeln(cast(OriginalType!(typeof(args[0])))args[0]); // 
Works...
   writeln(QW!(args[0]));// 
Doesn't work... MUST!


   writeln(staticMap!(QW, args));// 
Doesn't work... MUST!

}

void main()
{
   bool runTimeBool = true;
   print(MyEnum.First, 7, runTimeBool, MyEnum.Second);
}


Must print "F_i_r_s_t" and "S_e_c_o_n_d", not just "First" and 
"Second".


args are runtime arguments.

import std.experimental.all;

enum MyEnum : string
{
First = "F_i_r_s_t",
Second = "S_e_c_o_n_d"
}

///alias QW(alias arg) = 
Alias!(cast(OriginalType!(typeof(arg)))arg);

auto QW(T)(const auto ref T x){
return cast(OriginalType!T)x;
}

void print(T...)(T args)
{
writeln(cast(OriginalType!(typeof(args[0])))args[0]); // 
Works...
///writeln(QW!(args[0]));// 
Doesn't work... MUST!

writeln(QW(args[0]));

static foreach(alias arg; args){
static if(is(typeof(arg) : MyEnum))write(QW(arg));
else write(arg);
}
write('\n');
//writeln(staticMap!(QW, args));// 
Doesn't work... MUST!

}

void main()
{
bool runTimeBool = true;
print(MyEnum.First, 7, runTimeBool, MyEnum.Second);
}



Can't print enum values

2018-08-30 Thread Andrey via Digitalmars-d-learn

Hello,
This code doesn't print enum values:

import std.meta;
import std.traits;
import std.stdio;

enum MyEnum : string
{
   First = "F_i_r_s_t",
   Second = "S_e_c_o_n_d"
}

alias QW(alias arg) = 
Alias!(cast(OriginalType!(typeof(arg)))arg);


void print(T...)(T args)
{
   writeln(cast(OriginalType!(typeof(args[0])))args[0]); // 
Works...
   writeln(QW!(args[0]));// 
Doesn't work... MUST!


   writeln(staticMap!(QW, args));// 
Doesn't work... MUST!

}

void main()
{
   bool runTimeBool = true;
   print(MyEnum.First, 7, runTimeBool, MyEnum.Second);
}


Must print "F_i_r_s_t" and "S_e_c_o_n_d", not just "First" and 
"Second".