C++11支持lambda,匿名函数可以随处方便的书写,但是支持多种调用方式的匿名函数却不能直接支持。 重载匿名函数 可以借助于以下的overload_set方法实现: 继承自匿名函数对象类型; 通过using F::operator()声明访问匿名函数类型的成员函数 #include<string>#include<iostream> template<typename F1, typename F2> struct overload_set : F1, F2 { overload_set( F1 x1, F2 x2 ) : F1(x1), F2(x2) {} using F1::operator(); using F2::operator(); }; template <classF1, classF2> overload_set<F1,F2> overload(F1 ...
本文介绍python的面向对象编程。 类型定义和构造函数 使用class关键字,基类默认使用object,构造函数是特殊的__init__( self, arg… )方法,例如: class MyClass(object): def __init__(self, n): self.val = n def display(self): print self.val >>> t = MyClass(3) >>> t.display() 3 继承体系与super关键字 派生类调用基类的方法时,使用super来辅助完成。 class AddrBookEntry(object): def __init__(self, nm, ph): self.name = nm self.phone = ph def update(self, new_nm, new_ph): self.name = new_nm self.phone = new_ph def ...
lambda函数是匿名的,但是如果需要实现递归,那么必须要绑定名字,但是我们又不想因此而麻烦去定义函数。 关于绑定名字: 对于python这样的动态类型语言,可以直接将lambda函数赋值给变量; 对于C++这种强静态类型,可以使用函数存储器boost::function来存储; 对于Erlang这种纯函数式语言,我们无法实现 ...
本文介绍python中函数式编程的一些细节。 函数参数 默认参数 python的默认参数使用与C++一致的语法: 语法表达:def_arg = def_val 所有的位置参数必须在任何一个默认参数之前 默认参数常常用于定义函数的默认行为,例如: def tax_cost( cost, rate = 0.1 ): return cost * rate >>> tax_cost(100) 10.0 >>> tax_cost(100, 0.5) 50.0 命名参数(keyword arguments) python函数支持命名参数,这使得pyt ...
python中迭代是一种重要的方式,使得代码简洁,再加上列表解析等,大大增强迭代对应的表达语义。 然而自己手动写迭代器并非很简洁,需要定义类,定义__iter__()以及next()方法,而生成器的产生正式基于对语义简化表达的优化。 生成器 在语法上,生成器很像一个带yield语句的函数,不过与普通函数不同的是,生成器可以通 ...
python内建的类型:数值类型,序列,字典,文件,自定义类型,实例,异常等。 判断为False的条件 None False 数值类型的值为0的,如:0,0L,0.0等 空的序列,如:'',(),[] 空的map,如:{} 自定义类型的实例,如果类型定义了nonzero()或len()方法,并且方法返回0或False Boolean操作 或:x or y 并 ...
对象自动序列化常常是很有用的,因为这样实现了字符串与class结构之间的无缝转换,很多客户端与服务端的交互都是类似json这样的格式传输的,转换的自动化就显的很有价值。 # encoding: utf-8 import json # 支持自动序列化的基类 class archive_json( object ): def from_json(self, json_str): obj = json.loads(json_str) for key in vars(self): if key in obj: setattr(self, key, obj[key]) def to_json(self): return json.dumps( vars(self) ) # 测试类结构 class MyClass( archive_json ): def __init__(self): self.name = u'' self.degree = 0 self.scores = [] def main(): t = MyClass() t.name = u'zhenshan' t.degree = 6 t.scores ...
基本数据结构是语言中的重要部分,本文介绍python的数据结构:序列和关联容器。 python的序列类型有:string, Unicode string,list,tuple,bytearray,buffer,xrange等,这里介绍Unicode string,list和tuple,另外几个在内建函数中介绍。 python的关联容器有:s ...
Unicode编码是通用的宽字节编码,通常情况我们都只要直接使用Unicode编码即可,这样可以保证代码的通用。 然而,Unicode宽字节,稍微有些浪费,对于每个单字节可以表示的ASCII编码也是有双字节,因而在网络通信中为节省带宽,常常不是直接使用unicode,而是使用utf-8,gbk等紧凑的编码方式。 编码转换的 ...
列表解析(List Comprehensions)是针对列表的操作语法,使得处理列表的表达能力大大提升。 python中列表解析的基本语法 [ expr for iter_var in iterable if cond_expr ] 注: expr对应列表的每一项元素的任意表达式,返回每一次表达式计算值的列表 iter_var是可迭代对象iterable的迭代变量 可以有多个并列的for迭代语句(for iter_var ...
C++模板在编译期的行为与纯函数式编程有很多相似之处。通过观察函数式编程,并使用C++模板与之类比,来深入分析C++模板作为C++编译期的函数式编程的基础设施,掌握C++模板的本质及其灵活应用。 函数式编程的基本特征: 没有变量,函数没有副作用 支持闭包和高阶函数:函数作为第一类对象;高阶函数可以使用其他函数作为输入参数;函 ...
本质上,变长模板参数(Variadic Templates)也是一种函数式编程中常用的列表模式匹配。 变长模板参数 变长模板参数是对原有C++模板的轻量级的扩展,增加了对…省略号的支持,即: 如果模板参数带…,那么该模板参数可以匹配0个或多个实参; 对于类模板特化,扩展了针对…省略号的实例化的优先匹配规则: 非变长模板参数的特化比 ...
我最近常想到“稳定发挥”这个词。 政治课上有一句话,叫“螺旋式上升、波浪式前进”。拿到职场来说,刚工作的同事应该是这个样子。我们面前有很多可能,在哪个方向上突击一下都能形成一个波峰。 不过,有波峰,即有波谷。一名成熟的职业人,不能随便进入波谷状态,更要为岗位和其他人负责。职责愈大,愈不能随便波动,发挥的稳定性愈显得重要。 随 ...
与类模板的成员函数的非内联定义一样,类模板的static类型的数据成员需要使用外层模板的声明方式来初始化。 例子 template <typename T> classCSingleton { public: static T* Instance() { Lock::CLockWrapper guard(CriticalSection_); if (m_instance == NULL) { m_instance = new T; } ASSERT(m_instance != NULL); return m_instance; }; static void DestroyInstance() { Lock::CLockWrapper guard(CriticalSection_); if (m_instance) delete m_instance; m_instance = NULL; }; protected: CSingleton() { }; virtual ~CSingleton() { }; private: CSingleton(const CSingleton& source) { }; static T* m_instance; static Lock::CCriticalSectionWrapper CriticalSection_; }; template <typename T> Lock::CCriticalSectionWrapper CSingleton<T>::CriticalSection_; // 类模板的静态成员初始化语法 template <typename T> T* CSingleton<T>::m_instance = NULL; ...
proto转换(transform)使用实例。 带占位符的加法计算器 #include <iostream>#include <vector>#include <functional> #include <boost/proto/proto.hpp>namespace proto = boost::proto; template<int N> struct placeholder {}; proto::terminal< placeholder<0> >::type _1 = {{}}; proto::terminal< placeholder<1> >::type _2 = {{}}; // 获取terminal< placeholder<N> >终结符值的可调用转换 template<int N, typename dummy = proto::callable> struct get_data : proto::callable { typedef int result_type; result_type operator() ( std::vector<int> const& arg ) { if ( arg.size() >= (N+1) ) { return arg[N]; } return 0; } }; // 简单计算器语法 struct calculator : proto::or_< proto::when< proto::terminal< placeholder<0> >, get_data<0>( proto::_data ) >, proto::when< proto::terminal< placeholder<1> >, get_data<1>( proto::_data ) >, proto::when< proto::terminal< int >, proto::_value >, proto::when< ...