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

史密斯·赛肯(Smit Ycyken)

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

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);

在模板需要实现调用函数与传递的参数std::vectorUINT参数可能不同,因此需要将其强制转换为正确的类型。

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)
最高66

不确定...但是我想您需要一个功能助手和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_sequence,这std::make_index_sequence()是C ++ 14的功能;但是,如果您需要C ++ 11解决方案,则可以轻松创建一些东西来替代它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可变参数模板作为std :: function的参数

std :: function的可变参数模板参数

如何使用可变参数模板使用std :: function

std :: function中的可变参数模板参数匹配

可变参数模板,std :: function和lambdas作为类成员

可变参数模板,类型扣除和std :: function

std :: function到可变参数成员函数,然后绑定可变参数模板参数

为什么模板参数推导因std :: function回调的可变参数模板参数而失败?

多维std :: array的可变参数模板

使用特殊化的可变参数模板作为模板参数

在可变参数模板中使用std :: placeholders

对可变参数模板结构使用std :: visit

使用可变参数模板的工厂模式?

使用可变参数模板扩展

使用可变参数模板打印列表

在可变参数模板中使用对

如何从可变参数模板参数创建std :: tuple <>?

可变参数模板包作为std :: unordered_map的键

使用可变参数类模板的模板参数调用可变参数函数模板?

使用可变参数模板构建函数参数

在C ++中使用可变参数模板迭代参数包

仅使用类型参数的可变参数模板

使用 AST 匹配器匹配可变参数模板参数

可变参数模板方法和std :: function-编译错误

C ++将std :: function对象传递给可变参数模板

在可变参数模板中从lambda隐式转换为std :: function

从具有可变参数模板构造函数的类型构造 std::function 对象

clang不使用可变参数推断可变参数模板函数中的模板参数

std::invoke 不喜欢可变参数模板成员函数?