0

我正在尝试将元组参数转发到 VS2012(更新 3)中的函数。

我的理解是,在 C++11 中使用可变参数模板是可能的,不幸的是,VS2012 仅支持“假”可变参数。

auto Values = std::make_tuple(4, 8);
auto Add = [](int a, int b) -> int { return a + b; };

auto Result = forward_to_function(Add, Values);

我希望 VS2012 中有一种方法可以实现上面显示的功能,但我不确定,如果没有真正的可变参数,这可能吗?

4

2 回答 2

1

我在第 9 频道的视频中看到提到过这样的“爆炸器”。我认为这是最近的“Going Native”有人(安德烈?)据报道有一个完整的通用解决方案,但没有提出。讨论的可行解决方案不太完整。

如果您可以等待,当前的 VS 预览版编译器具有真正的可变参数。

看看 Boost 是怎么做的:实现一大堆 args,用一个特殊的标志类型作为默认参数,表明它丢失了。

通常,对于一个函数(不是一个类),我会重载它。重载模板函数也很好:forward_to_function 的参数必须扩展,以便它可以匹配每个参数类型,所以无论如何你都在这样做。只有你写一些固定数量的参数而不是“...”。用另一个具有不同数字的定义重载它,与程序实际需要的一样多。

-约翰

于 2014-06-25T23:10:47.797 回答
1

我知道您正在寻找与 VS2012 兼容的答案,但无论如何我都会发布此解决方案,以防您碰巧能够升级编译器以获得某些 C++14 支持。

如果你发现一个毛茸茸的 C++03/C++11 解决方法,那么你总是可以将它与这个 C++14 代码进行比较 :)

可以扩展元组的参数并使用 C++14 将它们传递给指定的函数std::integer_sequence

template <typename Func, typename Tuple, std::size_t... Indices>
auto forward_to_function(Func&& f, Tuple&& t, std::index_sequence<Indices...>) {
    return f(std::get<Indices>(std::forward<Tuple>(t))...);
}

template <typename Func, typename Tuple>
auto forward_to_function(Func&& f, Tuple&& t) {
    constexpr auto n = std::tuple_size<std::remove_reference_t<Tuple>>::value;
    return forward_to_function(std::forward<Func>(f),
           std::forward<Tuple>(t),
           std::make_index_sequence<n>{});
}

活生生的例子

于 2014-06-26T01:57:24.697 回答