C++ 模板系列小结07-尾置返回类型

在使用模板时可以显示指定模板类型,尤其是针对有返回类型的模板,显示指定可以避免类型转换带来的困扰。

但有时候显示指定模板实参类型会给用户增添额外负担,而且不会带来什么好处。

比如如下代码,接受表示序列的一对迭代器和返回序列中的一个元素的引用:

template<typename It>
??? &fcn(It beg,It end){
    return *beg;
}

我们并不知道返回结果的准确类型,但知道所需类型是所处理的序列的元素类型。

vector<int> vi = {1,2,3,4,5};
auto &i =fcn(vi.begin,vi.end());

如上代码,知道函数应该返回 *beg,而且知道我们可以用 decltype(*beg) 来获取此表达式的类型。

但是,在编译器遇到函数的参数列表之前,beg 都是不存在的。为此,我们需要使用尾置返回类型

[阅读全文]

C++ 模板系列小结06-可变参数模板特性

C++11 中引入了可变参数模板的特性,可变参数模板就是一个接受可变数目参数的模板函数或者模板类。

可变数目的参数被称为参数包,存在如下两种参数包:

  1. 模板参数包:表示零个或多个模板参数
  2. 函数参数包:表示零个或多个函数参数

具体如下所示,声明了一个可变参数函数模板。

// Args 是一个模板参数包;rest 是一个函数参数包
// Args 表示零个或多个模板类型参数
// rest 表示零个或多个函数参数
template <typename T,typename... Args>
void foo(const T &t, const Args&... rest);
[阅读全文]

C++ 中的多线程的使用和线程池建设

C++ 11 引入了 std::thread 标准库,方便了多线程相关的开发工作。

说到多线程开发,可不仅仅是创建一个新线程就好了,不可避免的要涉及到线程同步的问题。

而保证线程同步,实现线程安全,就要用到相关的工具了,比如信号量、互斥量、条件变量、原子变量等等。

这些名词概念都是来操作系统里面引申来的,并不是属于哪一种编程语言所特有的,在不同语言上的表现形式不一样,但其背后的原理是一致的。

C++ 11 同样引入了 mutex、condition_variable、future 等实现线程安全的类,下面就来一一了解它们。

[阅读全文]

C++ 模板系列小结03-在模板中指定变量类型

在之前的代码示例中,频繁用到 typename 关键字。

它的作用就是声明模板参数是类型参数(对于非类型参数,之前的文章也有提到了),也可以用 class 关键字来代替,但为了避免歧义,大多还是使用 typename 了。

除此之外,在模板的定义也可以使用 typename 关键字,用来指定变量的类型。

[阅读全文]

C++ 模板系列小结02-非类型模板参数

前面已经介绍了函数模板和类模板,还介绍了类模板的默认参数,在代码示例中都是用具体类型来作为模板参数的。

实际上,模板参数不局限于类型,普通值也可以作为模板参数,也就是本篇要讲的内容:非类型模板参数。

[阅读全文]

C++ 模板系列小结01-函数模板和类模板

现如今,掌握 C++ 模板技巧并且熟练使用可以说是能力进阶的必备内容了。

在一些优秀的开源项目中经常能看到模板的使用,要是不了解其使用方法,对分析源码都会有些阻碍。

推荐阅读《C++ Templates 中文版》一书,或许可以让你对 C++ 模板有个更加系统的概念,同时辅助阅读网上相关的博客文章加深理解,在代码实践中去掌握提高。

C++ 模板主要可以分为函数模板和类模板,这次就是介绍它们两个。

[阅读全文]