将一个函数中的可变参数传递给D中的另一个函数
我有一个变量D型函数将一个函数中的可变参数传递给D中的另一个函数,d,variadic-functions,D,Variadic Functions,我有一个变量D型函数foo(format,…),它是writefln的包装器。我想这样做: foo(format, <...>) { //... writefln(format, ...); } auto bar(T...)(T args) { ... } auto foo(T...)(T args) { return bar!T(args); } foo(格式,){ //... writefln(格式,…); } 本质上,将省略号参数传递给write
foo(format,…)
,它是writefln
的包装器。我想这样做:
foo(format, <...>) {
//...
writefln(format, ...);
}
auto bar(T...)(T args) { ... }
auto foo(T...)(T args)
{
return bar!T(args);
}
foo(格式,){
//...
writefln(格式,…);
}
本质上,将省略号参数传递给writefln。我知道这在C/C++中不容易/不可能,但有没有办法在D中实现这一点?如果需要模板,可以这样做:
foo(format, <...>) {
//...
writefln(format, ...);
}
auto bar(T...)(T args) { ... }
auto foo(T...)(T args)
{
return bar!T(args);
}
但是如果您想要运行时可变参数,那么您必须执行C所做的操作:将
\u argptr
传递到函数的“v-version”,例如vprintf
这将为您完成:
import std.stdio;
void customWrite(Args...)(string format, Args args)
{
writefln(format, args);
}
我已经忘记了那些类型的变量甚至存在于D中。我认为这甚至没有提到它们。我相信在D中总共有4种不同类型的变量
extern(C) void func(string format, ...) {...}
void func(T...)(string format, args) {...}
TypeInfo
void func(string format, ...) {...}
void func(string format, string[] args...) {...}
extern(C) void func(string format, ...) {...}
void func(T...)(string format, args) {...}
但是,使用3和4很容易。在这两种情况下,您只需将
args
传递给希望传递给的任何函数。两者都允许索引和切片(例如args[1]
和args[1..$]
)以及具有length
属性。因此,它们很容易使用,而且在大多数情况下,它们是更好的选择。我能想到的唯一例外是,如果您正在调用一个现有的C函数(在这种情况下,您使用#1),或者如果您需要异构模板,并且无法承受模板创建的二进制大小的增加(在这种情况下,您使用#2),这实际上只会是嵌入式环境中的一个问题。一般来说,#3和#4是更好的解决方案。可以是bar(args)
。你不应该需要!T
@JonathanMDavis:是的,我知道。但是当从另一个泛型调用泛型时,我总是显式地编写它,因为它常常使编译器错误更容易找到。(它不是说“我找不到匹配项”,而是告诉你它找不到匹配项。)@Mehrdad:一个值得注意的技巧!谢谢大家,事实证明模板非常干净优雅地解决了这个问题。额外的好处:它不会导致任何内存分配,因此可以从析构函数调用它(这是日志模块中的一个函数)。