在VS2012中转发函数的元组参数

时间:2014-06-25 22:52:04

标签: c++ visual-studio-2012 c++11 std-function stdtuple

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

我的理解是,使用可变参数模板的C ++ 11中this is possible,不幸的是,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中有一种方法可以实现上面显示的功能,但我不确定,如果没有真正的可变参数,这是否可行?

2 个答案:

答案 0 :(得分:1)

我看到了这样一个" exploder"在频道9视频中。我认为这是最近的" Going Native"据报道有人(安德烈?)有一个完整的通用解决方案,但没有提出。谈到的完整可行解决方案较少。

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

看看Boost是如何做到的:实现一大堆args,使用特殊的标志类型作为默认参数,表明它已丢失。

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

-John

答案 1 :(得分: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>{});
}

Live example