美文网首页
C++利用函数指针实现函数式编程的方法

C++利用函数指针实现函数式编程的方法

作者: DarkBubble | 来源:发表于2018-03-02 14:25 被阅读91次

C++支持函数式编程,虽然使用的较少,下面列出一些用法:

  • 普通函数作为回调
    普通函数作为输入参数的高阶函数 是最基本的函数式用法:
// file: func_def.h
int func1(int a, int b);
int func2(int a, int b);

// ...
// file: callback_example.cpp
#include "func_def.h"
#include <map>
#include <iostream>
#include <exception>

// callback func1/func2 by name "func1" and "func2"
void callback(const std::string& name, int p1, int p2)
{
  typedef std::string string;
  typedef int (*func_t)(int,int);
  static std::map<string, func_t> funcmap;
  if(funcmap.find(name)!=funcmap.end())
  {
    return (funcmap[name])(p1,p2);
  }else
  {
    throw std::exception("function_not_found");
  }
}
  • 部分函数的实现
    利用struct用来模拟绑定部分参数,实现类似部分函数(partial function)调用,这里我们定义一个struct partial_apply来实现函数和部分参数的动态绑定:
// file: partial_apply.
struct partial_apply
{
  typedef int(*func_t)(int,int)
  partial_apply(func_t _func_ptr, int _p1) : func_ptr(_func_ptr), p1(_p1) {}

  int operator() (int p2) const { return (*func_ptr)(p1,p2); }
  func_t func_ptr;
  int p1;
};

// ...
// file: partial_apply_example.cpp
#include "func_def.h"
#include <iostream>
int apply_add1(int p)
{
  partial_apply instance(func1, p); // func1 defined in file func_def.h
  int ret[10];
  for(int i=0; i<10;++i) 
    ret[i] = instance(1);
}

在这个例子里,struct partial_apply的构造函数绑定了一个二元函数,和这个函数的第一个参数,而它的成员算符operator()(int)const是一个一元函数,将参数作为原输入函数的第二个参数,并且求值返回。

  • 成员函数指针的调用
    C++可以调用成员函数指针,不过定义时需要加上成员函数所属类型的标识符,如下:
struct A
{
  int func1(int p1, int p2);
  int func2(int p1, int p2);
};
typedef int (A::*member_func_t)(int,int);

注意:调用成员函数指针时按如下方式:

void my_example()
{
  A a, b;
  A* ptr = &a;

  // acquire the function pointer
  A::member_func_t f1 = &A::func1;
  A::member_func_t f2 = &A::func2;

  // call by reference  
  (a.*f1)(1,2); // call a.func1(1,2)
  (b.*f2)(2,3); // call b.func2(2,3)

  // call by pointer
  (ptr->*f1)(1,2); // call ptr->func1(1,2)
  (ptr->*f2)(2,3); // call ptr->func2(2,3) 
}

使用成员函数,也是为了实现类似部分绑定,部分被绑定的参数作为类实例(对象)的其他成员。

相关文章

  • C++利用函数指针实现函数式编程的方法

    C++支持函数式编程,虽然使用的较少,下面列出一些用法: 普通函数作为回调普通函数作为输入参数的高阶函数 是最基本...

  • GO学习笔记(12)-斐波那契数列与函数编程

    目录 函数指针 vs 函数式编程 闭包 斐波那契数列与函数接口 函数指针 vs 函数式编程 函数是go语言中的...

  • C++函数指针和Swift的函数对象

    C++函数指针和Swift的函数对象 在C++中学习函数指针式非常痛苦的事情,而在Swift里面学习函数指针则是非...

  • Scala 学习笔记

    Scala 学习笔记 1.函数式编程 函数式编程:函数式编程把函数当作一等公民,充分利用函数,支持函数的多种使用方...

  • 函数式编程

    我们今天说的Go中的函数式编程主要是体现在闭包上面的,比如 我们首先对比两个概念 函数式编程 vs 函数指针 函数...

  • freeCodeCamp 旅途8 - 函数式编程

    函数式编程 函数式编程是一种基于函数计算的软件开发方法。像数学一样,函数在编程中通过输入产生输出。函数式编程遵循几...

  • 函数式编程从零到一

    从零到一:很纯的函数式 从干活的角度看待函数式编程和一般的编程方法 函数addOne是一个函数式编程的写法 函数a...

  • 技能

    C++ C++特性 C++11 多态和继承 构造函数 析构函数 手写代码实现string类 手写代码实现智能指针 ...

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • Java lambda表达式

    1. Java函数式接口 Java实现函数式编程的方式是函数式接口(functional interface),函...

网友评论

      本文标题:C++利用函数指针实现函数式编程的方法

      本文链接:https://www.haomeiwen.com/subject/fgraxftx.html