具有重复类型的 C++ 可变参数模板

Bas*_*sti 0 c++ templates variadic-templates

是否可以编写可变参数模板或折叠表达式,其中函数签名可以是这样的

void f(int, string, int, string, ...)
Run Code Online (Sandbox Code Playgroud)

这种风格在 Python 中非常流行且用户友好,但我无法在 C++ 中使用它。特别是,我会使用它来为绘图函数提供数据,后跟一个标签。

编辑:为了扩展,我想这样调用函数:

f(5, "first number");
f(5, "first number", 6, "second number");
Run Code Online (Sandbox Code Playgroud)

并带有 4、6 或 ... 2*n 个参数。

cig*_*ien 5

您可以编写这样的可变参数函数:

template<typename ...Ts>
void f(int data, string const &label, Ts&&... rest)
{
  process(data, label);
  f(std::forward<Ts>(rest...));
}
Run Code Online (Sandbox Code Playgroud)

使用基本情况:

void f() {}
Run Code Online (Sandbox Code Playgroud)

来终止递归。

现在只调用以下形式:

f(1, "hi");           // ok
f(1, "hi", 2, "bye"); // ok
// etc
Run Code Online (Sandbox Code Playgroud)

将编译,而:

f(1);          // error
f("hi");       // error
f(1, "hi", 2); // error
Run Code Online (Sandbox Code Playgroud)

将不会。