c++ - 如何部分特化函数以调用以元组元素作为参数的函数

标签 c++ templates variadic-templates variadic-functions

我正在尝试使用未打包的元组调用函数,但我遇到了一个问题。我的代码依赖于在函数为零时对函数进行特殊处理的能力。此代码不起作用,但我如何使用有效的 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

最佳答案

C++ 中没有模板函数的偏特化。让您的函数遵循可以部分特化的类模板。

namespace detail {
  template<...>
  struct callFunctionFromTupleImpl {
    static ret do_call(...) {
    }
  };

  // + more partial specializations
}

template <class ret, class ... Ts>
ret callFunctionFromTuple(ret (*function)(Ts...), std::tuple<Ts...> tuple) {
    return detail::callFunctionFromTupleHelperImpl<ret, Ts...>::do_call(function, tuple);
}

关于c++ - 如何部分特化函数以调用以元组元素作为参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44743696/

相关文章:

c++ - boost::filesystem::unicode 文件路径的路径?

c++ - 二维函数最小化算法或 C/C++ 库

C++ 模板 - 完整指南 : Wording of footnote about decltype and return type

c++ - sizeof 可变参数模板(所有元素的 sizeof 之和)

c++ - 如何将您自己的 C 代码编译为 ModemManager 的一部分

c++ - 叉和计算,谁能解释一下代码?

python - 找到较低级别的模板

c++ - 接受 0 个参数并返回类型可转换为 int 的未知类方法回调

C++ 模板元编程 : find out if variadic type list contains value

c++11:模板参数中为空