我有一个可变的D风格函数foo(format, ...)
,它是writefln
的包装器。我想做这样的事情:
foo(format, <...>) {
//...
writefln(format, ...);
}
基本上,将省略号参数传递给writefln。我知道这在C / C ++中并不容易/可能,但有没有办法在D中实现这一点?
答案 0 :(得分:4)
这将为你做到:
import std.stdio;
void customWrite(Args...)(string format, Args args)
{
writefln(format, args);
}
答案 1 :(得分:4)
我忘记了D中甚至存在那种类型的变量。我不认为TDPL甚至提到它们。我相信这在D中总共有4种不同类型的变量。
C variadics
extern(C) void func(string format, ...) {...}
使用TypeInfo
void func(string format, ...) {...}
使用数组的均匀可变参数
void func(string format, string[] args...) {...}
使用模板可变参数的异构可变参数
void func(T...)(string format, args) {...}
我相信TDPL实际上只谈到#3和#4,而这些都是我通常使用的,所以我必须去挖掘如何使用#2传递参数。我希望它与你在C中用#1做的类似,但我不知道。
然而,#3和#4很容易。在这两种情况下,您只需将args
传递给您想要传递给它的任何函数。并且两者都允许索引和切片(例如args[1]
和args[1 .. $]
)以及具有length
属性。因此,它们易于使用,而且在大多数情况下,它们是更好的方法。我能想到的唯一例外是,如果您正在调用现有的C函数(在这种情况下,您使用#1),或者您需要异构模板,并且无法承受模板创建的二进制大小的增加(其中你使用#2的情况,这应该只是嵌入式环境中的一个问题。一般来说,#3和#4只是更好的解决方案。
答案 2 :(得分:3)
如果你想要模板,你可以这样做:
auto bar(T...)(T args) { ... }
auto foo(T...)(T args)
{
return bar!T(args);
}
但如果您想要运行时可变参数,那么您必须执行C所做的操作:将_argptr
传递给函数的“v-version”,例如: vprintf
。