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