将一个函数中的可变参数传递给D中的另一个函数

时间:2011-09-23 20:24:11

标签: d variadic-functions

我有一个可变的D风格函数foo(format, ...),它是writefln的包装器。我想做这样的事情:

foo(format, <...>) {
    //...
    writefln(format, ...);
}

基本上,将省略号参数传递给writefln。我知道这在C / C ++中并不容易/可能,但有没有办法在D中实现这一点?

3 个答案:

答案 0 :(得分:4)

这将为你做到:

import std.stdio;
void customWrite(Args...)(string format, Args args)
{
    writefln(format, args);
}

答案 1 :(得分:4)

我忘记了D中甚至存在那种类型的变量。我不认为TDPL甚至提到它们。我相信这在D中总共有4种不同类型的变量。

  1. C variadics

    extern(C) void func(string format, ...) {...}
    
  2. 使用TypeInfo

    的D变量
    void func(string format, ...) {...}
    
  3. 使用数组的均匀可变参数

    void func(string format, string[] args...) {...}
    
  4. 使用模板可变参数的异构可变参数

    void func(T...)(string format, args) {...}
    
  5. 我相信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