我正在为自己创建一个库,其中包含我经常使用的函数和宏,并且不想不断地重新输入或复制/粘贴(有时长达数百行)。我在一个旧项目中有一大块代码,我必须不断复制和粘贴,然后更改所有变量名称以适合我当前的项目。我想将代码块变成我的库中的函数。
大量的代码格式输出到一个盒子中,因此如果输出太长,它不会破坏我可能拥有的任何边框或直接到达控制台的边缘(这让我烦恼)。用户通过框的左上角并提供文本不应通过的右边缘的 x 坐标。其余参数是要输出的变量或文字。该代码块将所有变量和文字放入一个大字符串中,然后逐个字符地输出该字符串,直到输出到达 x 边界。然后输出在左上角的 x 坐标处继续向下一行。
为了使其工作,该函数必须有一个可变模板以允许可变数量的多种类型的输出(类似于 cout << "I have " << 4.5 << " cookies and " << 2 << " friends."
)。
模板已完成并可以正常工作,直到我尝试创建模板类型的数组并对其进行初始化。
template<typename ...Inputs>
void textBox(int x, int y, int xBoundary, const Inputs&... things) {
Inputs arr[sizeof...(things)] = {things...};
}
此时我收到此错误:parameter packs not expanded with '...' Note: 'Inputs'
我以前使用过这种类型的东西,但该函数的所有输入都具有相同的类型,因此我可以轻松地执行此操作:
template<typename ...Inputs>
void textBox(int x, int y, int xBoundary, const Inputs&... things) {
std::string arr[sizeof...(things)] = {things...};
}
这不会给出任何错误,除非用户尝试传递字符串以外的东西,所以我知道我的错误与创建模板类型数组有关。任何帮助,将不胜感激!
最佳答案
数组需要包含相同类型的元素 - 它们不是异构数据结构。在您的情况下,Inputs
是一个包含所有类型的things...
的包,它未扩展,这就是您收到错误的原因。
使用 std::tuple
代替,这是一个异构容器:
std::tuple<std::decay_t<Inputs>...> tuple{things...};
或std::make_tuple
:
auto tuple = std::make_tuple(things...);
在 C++17 中,由于类模板参数推导,模板参数可能会被省略:
std::tuple tuple{things...};
如果您想迭代事物...
,最好不要将它们放入std::tuple
中。在 C++17 中,您可以使用折叠表达式来打印所有内容:
(std::cout << ... << things);
在 C++11 中,您可以定义伪递归可变参数模板:
template <typename T>
void print(const T& x)
{
std::cout << x;
}
template <typename T, typename... Rest>
void print(const T& x, const Rest&... rest)
{
print(x);
print(rest...);
}
关于c++ - 可变参数模板参数的模板类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50332724/