加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++ 模板介(零)—— 简介

发布时间:2020-12-15 04:53:10 所属栏目:百科 来源:网络整理
导读:C++ 模板简介 首先推荐 C++ 官方模板介绍 SFINAE(很多内容被 Concepts 取代) Meta programming(很多内容被 constexpr 函数取代) Tuple Any (看完上面介绍你就觉得全部讲的毫无用处了) 建议你先了解一下模式匹配与模板偏特化是什么东西,否则你可能 4

C++ 模板简介

首先推荐 C++ 官方模板介绍

SFINAE(很多内容被 Concepts 取代)

Meta programming(很多内容被 constexpr 函数取代)

Tuple

Any

(看完上面介绍你就觉得全部讲的毫无用处了)

建议你先了解一下模式匹配与模板偏特化是什么东西,否则你可能 4 篇文章都看不懂。

模式匹配

模式匹配指的是,检查某一个词汇序列是否满足给定的一些模板。对于函数式编程语言来说(当然 C++ 并不是函数式编程语言),函数的参数就可以进行模式匹配,比如:

fac :: Int -> Int -- 定义函数 fac 的类型,你可以理解为第一个参数是 Int,返回值是 Int

fac 0 = 1 -- 规定第一个参数为 0 的时候返回值是 1

fac n = n * fac (n - 1) -- 否则对于其他的参数 n,等于 n - 1 的阶乘的值乘上 n

上述代码是一个简单的模式匹配的例子,我指定了某个参数为什么值的时候函数的返回值是什么。我们再来看一个例子:

len :: [a] -> Int -- 定义函数 len 的类型,你可以理解为第一个参数为元素类型任意的列表(数组),返回值是 Int

len [] = 0 -- 如果列表是空的列表,那么显然其长度为 0

len (x:[]) = 1 -- 如果列表只有一个元素,那么显然其长度为

len (x:xs) = 1 + len xs

len 函数的参数我们分了 3 种情况讨论,而这三种情况都是相互排斥的。我们考虑 C++ 中模板偏特化的模仿:

template

struct len;

template

struct len { static const size_t value = 0; };

template

struct len { static const size_t value = 1; };

template

struct len { static const size_t value = 1 + len::value; };

这样我们就模仿实现了 Haskell 版本的代码,你可以看到前两行是类型声明,之后 3 个 len 一一对应。也就是说,模板的偏特化实际上就是在做模式匹配。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读