c++ - 使用 std::function 作为参数的可变参数模板

标签 c++ c++11 templates variadic-templates std-function

如何简化下面的代码。这里可以使用元组吗?如果是,你能解释一下吗?

template<typename Out, typename T1, typename T2, typename T3, typename T4>
void ProcessIncomingCommand(PClientContext pClientContext,
    DWORD & bytesProcessed,
    const std::function<Out(T1, T2, T3, T4)> &function,
    const std::vector<UINT> &params);

template<typename Out, typename T1, typename T2, typename T3>
static void ProcessIncomingCommand(PClientContext pClientContext,
    DWORD & bytesProcessed,
    const std::function<Out(T1, T2, T3)> &function,
    const std::vector<UINT> &params);

template<typename Out, typename T1, typename T2>
static void ProcessIncomingCommand(PClientContext pClientContext,
    DWORD & bytesProcessed,
    const std::function<Out(T1, T2)> &function,
    const std::vector<UINT> &params);

在模板实现中,需要使用 UINTstd::vector 传递的参数来调用函数。参数可能不同,因此需要将它们转换为正确的类型。

auto resFromFunction= function(params.at(0),
    params.at(1),
    static_cast<T3>(params.at(2)),
    static_cast<T4>(params.at(3)));

我如何使用log0在这里回答?

template<typename Out, typename... T>static void ProcessIncomingCommand(PClientContext pClientContext,
DWORD & bytesProcessed,
const std::function<Out(T...)> &function,
const std::vector<UINT> &params)

最佳答案

不确定...但我想你需要一个函数助手和 std::index_sequence (或类似的东西)。

一个可能的例子

template <typename Out, typename ... Ts, std::size_t ... Is>
static Out PIC_helper (
   PClientContext pClientContext,
   DWORD & bytesProcessed,
   const std::function<Out(Ts...)> &function,
   const std::vector<UINT> &params,
   std::index_sequence<Is...> const &)
 { return function( static_cast<Ts>(params.at(Is))... ); }

template <typename Out, typename ... Ts>
static void ProcessIncomingCommand (
   PClientContext pClientContext,
   DWORD & bytesProcessed,
   const std::function<Out(Ts...)> &function,
   const std::vector<UINT> &params)
 {
   Out resFromFunction
      = PIC_helper(pClientContext, bytesProcessed, function, params,
                   std::make_index_sequence<sizeof...(Ts)>());

   // other ...
 }

观察到 std::index_sequencestd::make_index_sequence() 是 C++14 功能;但如果您需要 C++11 解决方案,您可以轻松创建一些东西来替代它们。

关于c++ - 使用 std::function 作为参数的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43913422/

相关文章:

c++ - 如何根据模板类型启用继承开关

c++ - pclose() 返回的管道终止状态是否在所有平台上都左移了八位?

c++ - 如何通过鼠标单击选择一个位置并在 QGraphicsView 中添加一个项目?

c++ - 如何使用内联汇编程序保存寄存器值

c++ - 如何避免将参数传递给基于引用的帮助程序类的模板实例化

templates - 如何在 c++0x 中访问 lambda 的类型?

c++ - 模板推导失败,参数包后有参数

c++ - 将 QWebView 打印为 PDF

c++ - 选择正确的模板成员函数的返回类型

c++ - C++ 的自定义迭代器函数