将一个函数中的可变参数传递给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

我有一个变量D型函数
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,而这些都是我通常使用的,所以我必须深入研究如何使用#2传递论点。我希望它与C中使用#1时的操作类似,但我不知道


    但是,使用3和4很容易。在这两种情况下,您只需将
    args
    传递给希望传递给的任何函数。两者都允许索引和切片(例如
    args[1]
    args[1..$]
    )以及具有
    length
    属性。因此,它们很容易使用,而且在大多数情况下,它们是更好的选择。我能想到的唯一例外是,如果您正在调用一个现有的C函数(在这种情况下,您使用#1),或者如果您需要异构模板,并且无法承受模板创建的二进制大小的增加(在这种情况下,您使用#2),这实际上只会是嵌入式环境中的一个问题。一般来说,#3和#4是更好的解决方案。

    可以是
    bar(args)
    。你不应该需要
    !T
    @JonathanMDavis:是的,我知道。但是当从另一个泛型调用泛型时,我总是显式地编写它,因为它常常使编译器错误更容易找到。(它不是说“我找不到匹配项”,而是告诉你它找不到匹配项。)@Mehrdad:一个值得注意的技巧!谢谢大家,事实证明模板非常干净优雅地解决了这个问题。额外的好处:它不会导致任何内存分配,因此可以从析构函数调用它(这是日志模块中的一个函数)。