【问题标题】:How to pass the contents of a container to a variadic function in C++如何将容器的内容传递给 C++ 中的可变参数函数
【发布时间】:2018-08-07 14:22:19
【问题描述】:

假设我们有一个用于现有类型 T 的可变参数函数 void foo(T args...)

在 Java (void foo(T... args)) 和 C# (void foo(params T[] args)) 中,传递 T 类型的数组 T[] 是将其内容作为参数传递给 foo 的有效方法。

在 Scala (def foo(args: T*): Unit) 中,我可能会传递一个 Seq[T]

如何将容器(数组、向量、迭代器等)的内容作为参数传递给 C++ 中的可变参数函数?有没有可能?

【问题讨论】:

  • 看起来您的问题与thisthis 重复
  • 观察到void foo (T args...)void foo (T args, ...) 相同(省略号前的逗号是可选的)是C 风格的可变参数函数(所以va_listva_startva_arg , va_end),不是 C++11 风格的模板可变参数函数;如果你想要一个 C++11 风格的可变参数函数,你必须编写 template <typename ... Ts> void foo (Ts ... args) 来定义一个可变参数函数,该函数接收(可能)不同类型的可变参数列表。如果你想要一个相同类型元素的可变参数列表......嗯,有点复杂。
  • @NathanOliver 这两个问题都是相关的,但我认为它们不符合重复的条件,因为每个问题都针对特定情况,而这个问题涉及更一般的概念,即可变参数调用是否使用容器这种方式是可能的。我已经在谷歌上搜索了几天,但找不到答案,所以我们在这里。其他 C++ 初学者也可能找不到链接的问题。

标签: c++ variadic-functions


【解决方案1】:

C++ 中的 varargs 参数列表是在编译时建立的,而不是在运行时建立的,所以如果有的话,你只能传入一个固定长度的项目数组。

您可以使用std::apply() 调用带有tuple 参数的函数。你可以create a tuple from a fixed size array

或者,您也可以创建自己的类似apply 的模板帮助函数,该函数从数组元素递归组装参数包并为您调用该函数,或者使用标准中的无数元编程助手之一图书馆为你做这件事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2023-03-15
    • 2023-04-08
    • 2015-09-23
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    相关资源
    最近更新 更多