在VIM下写C++能有多爽?

Vim-Practice C++ NERDCommenter Vim YCM 快捷键 代码风格

我是坚定的Vim党,因为和命令行的集成如此之好,Vim可以解决任何问题。然而在这个世界上,即便是最好用的工具也是需要配置的。 由于最近在写C++,经过一番配置后,小编写C++已经感到非常爽了,于是决定用一篇文章来记录如何打造一个适合写C++的Vim编辑器! 包括C++的自动补全、括号引号匹配、格式化、注释、编译运行快捷键等。

如果你还不了解 Vim 基本操作和配置方法,请参考 Vim初级:配置和使用。 如果你和 Harttle 一样也做前端开发,可以参考 打造前端开发的 Vim 环境

感受Vim的强大:进阶技巧

Vim-Practice Bash Markdown Unix Vim 寄存器 快捷键

Vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。 如果你还没有使用过Vim,建议你先去看这个:Vim初级:配置和使用。本文介绍一些Vim的高级特性。包括块编辑、宏录制、语法高亮、键盘映射、函数定义、文件类型识别与对应插件加载等。

各种CSS选择器的优先级

CSS HTML 伪类 选择符

由于规则之间可以互相覆盖、子元素会继承父元素的部分规则,导致了CSS冲突的问题。 碰到CSS冲突时,通常我们会加入一些更加详细的规则或调整规则顺序来解决冲突。 那么优先级究竟是如何定义的呢?

先给出结论:ID>类或伪类或属性>类型或伪元素>通配选择器, 外部样式表和内部样式表拥有相同的优先级, HTML style属性拥有最高优先级,浏览器默认样式(UA Default)优先级最低。 对于相同优先级的规则,写在后面的会覆盖前面的。

C++手稿:STL中的函数对象与函数指针

C++ STL 指针 模板 运算符 函数对象 函数指针

STL是C++的标准模板库(standard template library),自然其中定义的都是模板。 相比于类和函数声明的显式接口(explicit interface),类模板和函数模板声明的接口属于隐式接口(implicit interface)。 因为模板参数应当满足的接口是由模板中表达式的合法性决定的,这一点给了模板很大的自由。 而函数对象函数指针具有同样的调用语法,因此STL中这两者常常可以互换。

更多关于隐式接口和显式接口的概念和区别,参见Effective C++: Item 41

先来感受一下C++中的函数对象和函数指针:

template<typename T>
void printer(int a, int b, T func){
    cout<<func(a, b)<<endl;
}

在STL中定义了很多像上面这样的模板,这里的T是一个可调用(实现了括号运算符)的东西。 这使得我们在使用模板时可以指定一个计算策略,它可以是函数对象,也可以是函数指针。

Less<int>便是一个常见的函数对象,常用来配置容器或算法。<functional>中定义了很多这样的函数对象。

函数指针

函数指针通常用来将函数传参或存储。例如:

int sum(int a, int b){
    return a+b;
}
int main(){
    printer(2, 3, sum);
    return 0;
}

上述的printer调用方式,编译器会生成对应的函数实例:

void printer(int a, int b, int (*func)(int, int)){
    cout<<func(a, b)<<endl;
}

这里T的类型是int (*)(int, int)

如果你是python或者javascript程序员的话,上述过程没有什么特别的。 唯一要注意的是func的声明方式,星号要和标识符括起来:(*func)

函数对象

函数对象是重载了括号运算符的类的实例,它也可以这样调用:func(a, b)。例如:

class Sum{
public:
    int operator()(int a, int b){
        return a+b;
    }
};

int main(){
    printer(2, 3, Sum());
    return 0;
}

编译器会生成这样的函数实例:

void printer(int a, int b, Sum s){
    cout<<s(a, b)<<endl;
}

函数对象可以实现更加复杂的有状态的运算,因为对象可以有更多的属性和方法。

导航: 上一页 下一页

加载中...

🔝