Dlang 泛型函数:test, test1, test2, test3 的用法详解
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 的结果。
- 涉及泛型:targ 参数使用了泛型,同时使用了模板字符串
示例代码:
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 著作权归作者所有。请勿转载和采集!