我正在尝试使用解压缩的元组调用函数,但是遇到了问题。我的代码依赖于在该函数为零时对其进行特殊处理的能力。该代码不起作用,但是如何使用有效的c++来完成此操作?

//Initialize Recursion
template <class ret, class ... Ts>
ret templateHelpers::callFunctionFromTuple(ret (*function)(Ts...), std::tuple<Ts...> tuple) {
    return callFunctionFromTupleHelper<sizeof...(Ts), ret>(function, tuple);
}

//Recursively break down the tuple
template <int NumLeft, class ret, class ... ArgsF, class ... ArgsT, class ... Args>
ret templateHelpers::callFunctionFromTupleHelper(ret (*function)(ArgsF...), std::tuple<ArgsT...> tuple, Args... ts) {
    return callFunctionFromTuple<numLeft - 1, ret>(funcTs(function, std::tuple<Tuples...> tuple, std::get<NumLeft-1>(tuple) Ts... ts));
}

//Finally Call the Function
//TODO: fix the error. Partial specialization does not work, including that <0>
template <class ret, class ... ArgsF, class ... ArgsT, class ... Args>
ret templateHelpers::callFunctionFromTupleHelper<0>(ret (*function)(ArgsF...), std::tuple<ArgsT...> tuple, Args... ts) {
    return func(ts...);
}

PS我正在使用VS2017

最佳答案

解压缩std::tuple的一种简单方法是使用sdt::index_sequence

#include<utility>
#include<tuple>

template<typename Ret, typename... Ts, size_t... I>
Ret callFunction_(Ret (*fn)(Ts...), std::tuple<Ts...> tup, std::index_sequence<I...>)
{
    return fn(std::get<I>(tup)...);
}

template<typename Ret, typename... Ts, typename Tuple>
Ret callFunction(Ret (*fn)(Ts...), Tuple&& tup)
{
    return callFunction_(fn, std::forward<Tuple>(tup),
        std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>{}>{});
}

Live

然后不需要委派类模板:)

10-08 08:28
查看更多