dlang-book/05-данные-и-функции-функцио.../src/chapter-5-10-3-2/app.d

70 lines
2.2 KiB
D
Raw Normal View History

2023-02-25 22:19:12 +00:00
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":
2023-02-25 22:54:57 +00:00
assert(_arguments.length == 2 && _arguments[0] is typeid(double) && _arguments[1] is typeid(double),
"Для типа complex должны быть переданы два аргумента типа double.");
2023-02-25 22:19:12 +00:00
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);
}