C++根据传入的函数指针来解析需要的参数(推荐)

C++可以根据传入的函数指针,获取自己需要的参数类型,然后根据参数源中获取需要的参数,这里我用tuple作为演示,不过,只要可以根据序号,或者顺序方式等获取实参,都可以使用类似的方式实现:

先给出一个辅助函数:

/** 获取第N个类型
*/
template <typename... Cases>
struct select
{
};
template <typename T, typename... Cases>
struct select<T, Cases...> : public select<Cases...>
{
  using ThisType = T;
  using Base = select<Cases...>;
};

下面给出实际的实现函数:

#include <functional>
#include "vs-help.h"

class TupleFunc
{
public:
  TupleFunc() { }

  // 函数的实际构造过程
  template <typename Ret, typename... Args, typename ParamsSource>
  void makeFuncAndParams(Ret(*func)(Args...), ParamsSource& paramSource)
  {
    makeFuncAndParamsImpl<0>(func, select<Args...>(), paramSource);
  }

  // 实际调用
  void invoke()
  {
    m_func();
  }

private:
  // 实际调用初始化
  template <size_t idx, typename Func, typename Select, typename ParamsSource, typename... Params>
  void makeFuncAndParamsImpl(Func&& func, Select, ParamsSource& paramSource, Params&&...args)
  {
    typename Select::ThisType param = std::get<idx>(paramSource);
    makeFuncAndParamsImpl<idx + 1>(func, Select::Base(), paramSource, std::forward<Params>(args)..., std::move(param));
  }

  // 结束调用
  template <size_t idx, typename Func, typename ParamSource, typename... Params>
  void makeFuncAndParamsImpl(Func&& func, select<>, ParamSource& paramSource, Params&&... args)
  {
    m_func = [func, args...]() { func(args...); };
  }
private:
  std::function<void()> m_func;
};

下面是测试用例:

void print(int x, std::string y)
{
  std::cout << "x: " << x << std::endl;
  std::cout << "y: " << y << std::endl;
}
int main()
{
  std::tuple<int, std::string, std::string> p = { 12, "job", "China" };
  TupleFunc func;
  func.makeFuncAndParams(&print, p);
  func.invoke();
  return 0;
}

通过使用lambda表达式,我们可以很方便的构建一个我们调用时需要的函数,而模板的存在,可以使我们在构建一个lambda表达式的时候,可以动态化,使某些情况下,更加灵活的构建各类处理函数map等。上面只是简单的演示,具体场景下,需要进行一定的修改。

总结

以上所述是小编给大家介绍的C++根据传入的函数指针来解析需要的参数,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • C语言中函数指针的三种使用方法总结

     C语言中函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 定义方式:int (*p)(int x, int y); 实现代码: #include <stdio.h> int sum(int x, int y){ return x + y; } int reduce(int x, int y){ return x - y; } int

  • C++获取类的成员函数的函数指针详解及实例代码

    C++获取类的成员函数的函数指针详解 用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} //static member void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member virtualvoid virtualmember(){cout<

  • C语言 指针变量作为函数参数详解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁. 像数组.字符串.动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合. 有的时候,对于整数.小数.字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值. 有些初学者可能会使用

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • C语言 函数指针(指向函数的指针)详解

    一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数.这种指针就是函数指针. 函数指针的定义形式为: returnType (*pointerName)(param list); returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表.参数列表中

  • C++中指针函数与函数指针的使用

    指针函数 指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针. 格式: 类型名* 函数名(函数参数列表) 使用: /* * 指针函数,返回int* 指针变量 */ int* add(int a, int b) { int *p; int c = a + b; p = &c; return p; } int main() { int* p; p = add(1, 4); printf("%d\n", *p); getchar(); return 1; } 函数指针 函数

  • C++函数指针和回调函数使用解析

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型变.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数.返回值的函数指针变量 实例 以下实例声明了函数指针变量 p,指向函数 max: #include <stdio.h> int max(int x, int y){ return x > y ? x

  • 详解C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:   函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原

  • C语言中函数指针与软件设计经验总结

    函数指针与软件设计 记得刚开始工作时,一位高手告诉我,说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后来明白那不单是跳来跳去那样简单,而是一种高级的异常处理机制,在某些情况下确实很有用. 为了显示自己的技巧,也在自己的程序中用过几次.渐渐发现这样的技巧带来的好处是有代价的,破坏了程序的结构化设计,程序变得很难读,尤其对新手来说.终于明白这种技巧不过是一种调味料,在少数情况使用几

  • C语言 用指针作为函数返回值详解

    C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> #include <string.h> char *strlong(char *str1, char *str2){ if(strlen(str1) >= strlen(str2)){ return str1; }else{ return str2; } } int main(){ cha

随机推荐