我正在尝试将元组参数转发到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中有一种方法可以实现上面显示的功能,但我不确定,如果没有真正的可变参数,这是否可行?
答案 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>{});
}