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<>(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 + >(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 = { , "job", "China" }; TupleFunc func;
func.makeFuncAndParams(&print, p);
func.invoke(); return ;
}

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

C++根据传入的函数指针来解析需要的参数的更多相关文章

  1. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  2. 函数parseQuery用于解析url查询参数

    在百度上找的,以后忘了再看. 语法如下: var obj = parseQuery(query) query是被解析的查询参数,函数返回解析后的对象. 使用范例如下: var jerry = pars ...

  3. Delphi 函数指针(三大好处:灵活,委托的本质,回调机制),还可把函数指针当参数传入

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  4. Keil C51 中的函数指针和再入函数

    函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...

  5. C++中的函数指针和函数对象总结

    篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. ...

  6. C#编程语言之委托与事件(一)—— C/C++函数指针和C#委托初步

    相信正在学习C#的人都有学习过C或C++的经验,本文要讲的第一个要点是C#中的委托(delegate,有些资料也叫代表).什么是委托,很多人都能自然而然地想到C/C++中的函数指针,事实上很多书和资料 ...

  7. C/C++ 函数指针使用总结

    一 函数指针介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为int ...

  8. c++ 函数指针简单实例

    一开始看函数指针的时候我是很懵的,因为不知道它有什么用,之后慢慢就发现了自己的愚昧无知. 假设我们想实现一个数据结构,比如二叉搜索树,堆.又或者是一个快排,归并排序. 我们一般是直接在两个数要比较的时 ...

  9. Z :彻底了解指针数组,数组指针以及函数指针 [复

    原创 :彻底了解指针数组,数组指针以及函数指针 [复制链接] 00 roking 白手起家 帖子 60 主题 16 精华 0 可用积分 74 专家积分 0 在线时间 0 小时 注册时间 2003-10 ...

随机推荐

  1. (5)MySQL的查询:模糊查询(通配符查询like)、限制符查询(limit)、排序查询(order by)、分组查询(group by)、(子查询)

    注意事项 指令语法的优先级: where > group by >order by > limit 例:select count(id) as cnt,age from tablen ...

  2. 重新生成ssh

    解决码云出现git@gitee.com: Permission denied (publickey). 很久之前好像改了ssh的一些配置,导致现在对git进行一些操作时,就会出现 当时就去百度,结果很 ...

  3. js实现一条抛物线

    抛物线运动解释: 以右开口为例,根据公式  y^2 = 2px .确定p的值,已知x求y. <!DOCTYPE html> <html> <head> <me ...

  4. 芯灵思SINA33开发板怎样创建编译环境

    首先在Vmware安装好Centos,在此不再重复步骤,大家可以看以前的帖子有详细的步骤.本节主要介绍如何在Centos 搭建编译环境 Step 1 更新 CentOS 源 CentOS 由于很追求稳 ...

  5. tile38 一款开源的geo 数据库

    tile38 是基于golang 编写的geo 数据库,支持地理空间索引.实时地理围栏,同时也支持leader-flower 的部署模型 备注: 下边测试一个简单的地理围栏功能 环境准备 docker ...

  6. Unity 官方教程 学习

    Interface & Essentials Using the Unity Interface 1.Interface Overview https://unity3d.com/cn/lea ...

  7. AIX系统日志

    1.系统错误日志 存放路径:/var/adm/ras/errlog 说明:该日志记录了系统所检测到的软硬件故障和错误,尤其对系统的硬件故障有很大的参考价值,是AIX提供的最有价值的日志之一, errl ...

  8. supervisord 知识点

    官方英文: Supervisor: A Process Control System Supervisor: 一个进程管理系统. Supervisor is a client/server syste ...

  9. es query_string 和 match 的区别

    默认使用 空格拆分成 多个 子项,并且 每个子项 都会去分词 查询.可以通过 default_operator 指定  子项之间的关系.默认是 或 . 然后 每个 子项前面可以使用 -+ 指定必须有 ...

  10. PHP 对象转数组 Object转array

    //调用这个函数,将其幻化为数组,然后取出对应值 public static function object_array($array) { if(is_object($array)) { $arra ...