Dlang 可变参数函数用法详解:test1 和 test3 的调用区别
Dlang 可变参数函数用法详解:test1 和 test3 的调用区别
Dlang 中允许定义可变参数函数,即可以接收不定数量的参数。在本文中,我们将深入探讨 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);
}
为什么 test1 可以直接调用 test1('hello',1,2,'wudi',3),而 test3 必须使用模板 test3!'jj'(1,2,3)?
-
test1的参数列表中,除了第一个参数funcName是string类型外,后面的参数是...,表示可变参数,可以接收不定数量的任何类型参数。因此,我们可以直接传递1,2,'wudi',3这些不同类型的值。 -
test3的参数列表中,除了第一个参数wudi是string类型外,后面的参数也是...,表示可变参数,但它需要使用模板来指定可变参数的类型。这是因为test3函数内部使用foreach循环遍历可变参数,而foreach循环需要知道可变参数的类型才能进行遍历。因此,在调用test3函数时,需要使用模板test3!'jj'(1,2,3)来指定可变参数的类型为'jj'。
类似的例子:
- C++ 中的可变参数模板:
template<typename... Args>
void myFunc(Args... args)
{
// do something
}
myFunc(1, 'hello', 2.0);
- Python 中的
*args和**kwargs:
def myFunc(*args, **kwargs):
print(args) # output: (1, 'hello', 2.0)
print(kwargs) # output: {}
myFunc(1, 'hello', 2.0)
总结:
-
在 Dlang 中,可变参数函数可以接收不定数量的参数,但需要使用模板来指定可变参数的类型。
-
可变参数函数的应用场景广泛,例如:
- 实现灵活的函数调用方式。
- 构建可扩展的函数库。
- 提高代码的复用性。
希望本文能帮助您理解 Dlang 可变参数函数的用法,并学会在不同场景下选择合适的调用方式。
原文地址: https://www.cveoy.top/t/topic/oqbK 著作权归作者所有。请勿转载和采集!