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

C++ variadic templates with repeating types

本文关键字:C++ 类型      更新时间:2023-10-16

是否可以编写可变模板或折叠表达式,其中函数签名可以类似

void f(int, string, int, string, ...)

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

edit:为了扩展,我想调用这样的函数:

f(5, "first number");
f(5, "first number", 6, "second number");

和4,6或。。。2*n个参数。

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

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

有一个基本情况:

void f() {}

以终止递归。

现在只有形式的调用:

f(1, "hi");           // ok
f(1, "hi", 2, "bye"); // ok
// etc

将编译,而:

f(1);          // error
f("hi");       // error
f(1, "hi", 2); // error

不会。

例如,定义两个重载:

void f() {}
template<class... Ts>
void f(int i, std::string s, Ts... ts) {
f(std::move(ts)...); // static recursion
}