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); }