C++支持函數(shù)式編程建芙,雖然使用的較少拦盹,下面列出一些用法:
- 普通函數(shù)作為回調(diào)
普通函數(shù)作為輸入?yún)?shù)的高階函數(shù) 是最基本的函數(shù)式用法:
// 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");
}
}
- 部分函數(shù)的實(shí)現(xiàn)
利用struct
用來(lái)模擬綁定部分參數(shù)延都,實(shí)現(xiàn)類(lèi)似部分函數(shù)(partial function)調(diào)用索绪,這里我們定義一個(gè)struct partial_apply
來(lái)實(shí)現(xiàn)函數(shù)和部分參數(shù)的動(dòng)態(tài)綁定:
// 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);
}
在這個(gè)例子里在验,struct partial_apply
的構(gòu)造函數(shù)綁定了一個(gè)二元函數(shù)炊林,和這個(gè)函數(shù)的第一個(gè)參數(shù)彩倚,而它的成員算符operator()(int)const
是一個(gè)一元函數(shù)筹我,將參數(shù)作為原輸入函數(shù)的第二個(gè)參數(shù),并且求值返回帆离。
- 成員函數(shù)指針的調(diào)用
C++可以調(diào)用成員函數(shù)指針蔬蕊,不過(guò)定義時(shí)需要加上成員函數(shù)所屬類(lèi)型的標(biāo)識(shí)符,如下:
struct A
{
int func1(int p1, int p2);
int func2(int p1, int p2);
};
typedef int (A::*member_func_t)(int,int);
注意:調(diào)用成員函數(shù)指針時(shí)按如下方式:
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)
}
使用成員函數(shù),也是為了實(shí)現(xiàn)類(lèi)似部分綁定岸夯,部分被綁定的參數(shù)作為類(lèi)實(shí)例(對(duì)象)的其他成員麻献。