【问题标题】:Call variadic function in C++ with array as arguments在 C++ 中使用数组作为参数调用可变参数函数
【发布时间】:2016-01-25 22:07:56
【问题描述】:

假设我有一个像这样的简单可变参数函数:

template <typename... A>
void func(A... args)
{
    //Do stuff
}

我需要另一个函数来调用数组中的参数,比如说:

int arg[3] = {1,2,3};

调用函数

func(1,2,3);

是否可以在不修改模板化函数的情况下做到这一点?

【问题讨论】:

标签: c++ variadic-templates


【解决方案1】:

你可以写apply,它引用一个数组和函子来调用解包后的数组(你可能想要添加完美的转发等):

template <typename F, typename T, std::size_t N, std::size_t... Idx>
decltype(auto) apply_impl (F f, T (&t)[N], std::index_sequence<Idx...>) {
    return f(t[Idx]...);
}

template <typename F, typename T, std::size_t N>
decltype(auto) apply (F f, T (&t)[N]) {
    return apply_impl(f, t, std::make_index_sequence<N>{});   
}

然后这样调用它,如果foo 是一个仿函数类:

apply(foo{}, a);

如果 foo 只是一个普通的模板函数,就像你的例子一样,你可以把它包装在一个 lambda 中:

apply([](auto...xs){foo(std::forward<decltype(xs)>(xs)...);}, a);

Live Demo

【讨论】:

  • 如果我想将多种类型传递给该模板怎么办,例如,我想调用 foo("a", 1, 3.0)。你对如何做到这一点有任何提示吗?
  • 使用std::tuple 和相同的方法,用t[Idx] 代替std::get&lt;Idx&gt;(t) 并用数组引用代替元组。
  • 但我也不知道先验我得到什么样的元素,可以是foo("a")foo(1,2.0)。否则我在指定std::tuple 时会遇到同样的问题所以我所拥有的只是一个配对列表,例如,第二个值指定类型,这还能完成吗?!
  • @Fynn 我不确定我是否理解。我建议提出另一个问题来详细说明您的问题。
猜你喜欢
  • 2014-10-24
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多