Dlang 泛型函数:test, test1, test2, test3 的用法详解

以下代码展示了 Dlang 语言中四个函数:test, test1, test2, test3。其中,test, test1, test3 函数使用了泛型。

void test(targ...)(targ hello)
{
    foreach(v;hello)
    {
        writeln(v,':',typeid(v)==typeid(string));
    }
}

int test1(string funcName,...)
{
    writeln(funcName);
    import core.vararg;
    int sum = 0;
    for (int i = 0; i < _arguments.length; i++)
    {
        auto temp = _arguments[i];
        if(temp==typeid(int))
        {
            sum += va_arg!(int)(_argptr);
        }
    }
    return sum;
}

int test2(int[] one...)
{
    int sum = 0;
    foreach(v;one)
    {
        sum += v;
    }
    return sum;
}

void test3(string wudi,targ...)(targ hello)
{
    writeln(wudi);
    foreach(v;hello)
    {
        writeln(v,':',typeid(v)==typeid(string));
    }
}

void main()
{
    
test(1,'2');
    writeln('-----------------------------------------');
    auto one = test1('hello',1,2,'wudi',3);
    writeln(one);
    writeln('-----------------------------------------');
    auto two = test2(5,6,7);
    writeln(two);
    writeln('-----------------------------------------');
    test3!'jj'(1,2,3);
}

泛型函数分析:

  • test 函数:

    • 涉及泛型:targ 参数使用了泛型,表示可以接受任何类型参数。
    • 用法:该函数接受可变数量的任意类型参数,并遍历每个参数,打印参数值和其类型是否为 string 的结果。
  • test1 函数:

    • 涉及泛型:使用了 core.vararg 库中的 va_arg 模板函数来获取可变参数列表中的参数类型。参数列表使用了 ... 表示可变参数。
    • 用法:该函数接受一个字符串参数和可变数量的任意类型参数,并统计所有 int 类型参数的总和。
  • test2 函数:

    • 涉及泛型:使用 int[] 表示该函数接受一个或多个 int 类型的数组。
    • 用法:该函数接受一个或多个 int 类型的数组,并计算数组中所有元素的总和。
  • test3 函数:

    • 涉及泛型:targ 参数使用了泛型,同时使用了模板字符串 test3!"jj" 来指定函数名。
    • 用法:该函数接受一个字符串参数 wudi 和可变数量的任意类型参数,并遍历每个参数,打印参数值和其类型是否为 string 的结果。

示例代码:

void test(targ...)(targ hello)
{
    foreach(v;hello)
    {
        writeln(v,':',typeid(v)==typeid(string));
    }
}

int test1(string funcName,...)
{
    writeln(funcName);
    import core.vararg;
    int sum = 0;
    foreach(arg; va_args)
    {
        static if(is(typeof(arg) == int))
        {
            sum += arg;
        }
    }
    return sum;
}

int test2(int[] one...)
{
    int sum = 0;
    foreach(v;one)
    {
        sum += v;
    }
    return sum;
}

void test3(string wudi,targ...)(targ hello)
{
    writeln(wudi);
    foreach(v;hello)
    {
        writeln(v,':',typeid(v)==typeid(string));
    }
}

void main()
{
    // test 函数的调用
    test(1,'2'); // 输出:1:false 2:true

    writeln('-----------------------------------------');

    // test1 函数的调用
    auto one = test1('hello',1,2,'wudi',3); // 输出:hello 6
    writeln(one);

    writeln('-----------------------------------------');

    // test2 函数的调用
    auto two = test2(5,6,7); // 输出:18
    writeln(two);

    writeln('-----------------------------------------');

    // test3 函数的调用
    test3!'jj'(1,2,3); // 输出:jj 1:false 2:false 3:false
}

在示例代码中,test1 函数的写法使用了 static if 来判断参数类型是否为 int,而不是使用 typeid 函数比较类型,这是一种更加优雅的写法。

总结:

Dlang 的泛型函数通过使用 targ 关键字和 ... 运算符来实现可变参数类型的函数。core.vararg 库中的 va_arg 函数可以用于获取可变参数列表中的参数类型。模板字符串可以用于指定函数名。通过使用这些特性,我们可以创建功能强大的泛型函数,并利用 Dlang 的静态类型检查机制确保代码的正确性。


原文地址: https://www.cveoy.top/t/topic/oqbt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录