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<Args...>
void print(Args ...args)
{
writeln(UnderlyingType(args)...); // UnderlyingType is a
function here
}