c++ - 可变参数模板参数的模板类型数组

标签 c++ c++11 templates variadic-functions

我正在为自己创建一个库,其中包含我经常使用的函数和宏,并且不想不断地重新输入或复制/粘贴(有时长达数百行)。我在一个旧项目中有一大块代码,我必须不断复制和粘贴,然后更改所有变量名称以适合我当前的项目。我想将代码块变成我的库中的函数。

大量的代码格式输出到一个盒子中,因此如果输出太长,它不会破坏我可能拥有的任何边框或直接到达控制台的边缘(这让我烦恼)。用户通过框的左上角并提供文本不应通过的右边缘的 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/

相关文章:

wpf - 使用 DataGrid 显示分层 XML 数据

c++ - 如何使用模板正确重写这个使用继承的 C++ 代码

C++模板: cannot combine with previous 'type-name' declaration specifier

c++ - 自定义 std::set 比较器 - 不匹配调用 [...]

c++ - 我怎样才能改进这个对象的实例化方式?

C++11 "auto"到非 C++11 编译器

python - django - 不显示模板文件中的更改

c++ - `.' 不能出现在常量表达式中

c++ - C/C++ 中最常用和最灵活的 SMTP Client 库是什么?

C++ 类 vector 错误,表达式必须是指针类型