泛型与函数式比较

来源:互联网 发布:单片机驱动无源蜂鸣器 编辑:程序博客网 时间:2024/05/22 21:38

  • 泛型设计
  • 函数式设计
  • 测试函数
  • 后记


用两个数做计算来看泛型思维函数式思维

泛型设计

enum Operation{  ADD,  SUB,  MUL,  DIV};// generic programmetemplate <typename T>T add(const T _num1,const T _num2){  return _num1+_num2;}template <typename T>T calculate(const T _num1,const T _num2, const Operation _op){  switch(_op)  {    case Operation::ADD:    {      return add<decltype(_num1)>(_num1, _num2);      break;    }    default:    {      break;    }  }}

泛型设计:类似于传统设计,但是考虑的重点是该代码段的通用性,即任何支持 ADD 操作的类型都可以使用该代码段。反之,如果想让程序兼容某个泛型结构,那你最好了解该泛型结构所支持的操作。就像使用 STL 的 algorithm 库和容器时,使用自定义类一般需要添加 < 或 != 的比较操作,因为这些算法或类的实现中有需要用到 < 或 != 这两个比较运算符。


函数式设计

// functional programmetemplate <typename T>function<T(T,T)> calculateSelection(const Operation _op){  switch(_op)  {    case Operation::ADD:    {      return [](T _num1, T _num2){        return _num1+_num2;      };    }  }}

函数式设计:函数是第一等公民(来自 Haskell 邪教的宣传,然并卵),我可以将函数当做对象,在要用的时候才用,理所当然的,你应该能想到,惰性计算这个东西,可以看到,我返回的结果是一个 lambda 表达式,而且是泛型的 lambda 表达式,这个表达式在编译期由编译器推导出来。


测试函数

int main(int argc, char const *argv[]) {  int x = 2,y = 3;  Operation operation = Operation::ADD;  // 泛型调用  cout << calculate(x, y, operation) << endl;  // 函数式调用  cout << calculateSelection<decltype(x)>(operation)(x,y) << endl;  return 0;}

函数式设计在调用的时候,如果我愿意,我可以保留一个可调用对象来保存这个生成的了 lambda 表达式,然后在想用的时候再用。


后记

其实泛型与函数式没啥可比较的,因为它们的关注点不同,虽然它们都是某一种编程范式。


CSDN 辣鸡 MD 编辑器,无序列表格式全丢