69 lines
2.1 KiB
D
69 lines
2.1 KiB
D
|
import core.stdc.stdarg, std.conv;
|
||
|
|
||
|
string dToString(string type, ...)
|
||
|
{
|
||
|
va_list args_list;
|
||
|
va_copy(args_list, _argptr);
|
||
|
scope(exit) va_end(args_list);
|
||
|
|
||
|
switch (type) {
|
||
|
case "int":
|
||
|
assert(_arguments.length == 1 && _arguments[0] is typeid(int), "Аргумент должен иметь тип int.");
|
||
|
auto int_val = va_arg!int(args_list);
|
||
|
return to!string(int_val);
|
||
|
case "double":
|
||
|
assert(_arguments.length == 1 && _arguments[0] is typeid(double), "Аргумент должен иметь тип double.");
|
||
|
auto double_val = va_arg!double(args_list);
|
||
|
return to!string(double_val);
|
||
|
case "complex":
|
||
|
assert(_arguments.length == 2 && _arguments[0] is typeid(double) && _arguments[1] is typeid(double), "Для типа complex должны быть переданы два аргумента типа double.");
|
||
|
auto re_val = va_arg!double(args_list);
|
||
|
auto im_val = va_arg!double(args_list);
|
||
|
return to!string(re_val) ~ " + " ~ to!string(im_val) ~ "i";
|
||
|
case "string":
|
||
|
assert(_arguments.length == 1 && _arguments[0] is typeid(string), "Аргумент должен иметь тип string.");
|
||
|
return va_arg!string(args_list).idup;
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unittest
|
||
|
{
|
||
|
assert(dToString("int", 5) == "5");
|
||
|
assert(dToString("double", 2.0) == "2");
|
||
|
assert(dToString("string", "Test string") == "Test string");
|
||
|
assert(dToString("complex", 3.5, 2.7) == "3.5 + 2.7i");
|
||
|
}
|
||
|
|
||
|
import std.stdio, std.variant;
|
||
|
|
||
|
void pseudoVariadic(Variant[] vars)
|
||
|
{
|
||
|
foreach (var; vars)
|
||
|
{
|
||
|
if (var.type == typeid(string))
|
||
|
{
|
||
|
writeln("Строка: ", var.get!string);
|
||
|
}
|
||
|
else if (var.type == typeid(int))
|
||
|
{
|
||
|
writeln("Целое число: ", var.get!int);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
writeln("Незнакомый тип: ", var.type);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void templatedVariadic(T...)(T args)
|
||
|
{
|
||
|
pseudoVariadic(variantArray(args));
|
||
|
}
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
templatedVariadic("Здравствуй, мир!", 42);
|
||
|
}
|