当前位置: 首页 > news >正文

建设电影网站中小型电子商务网站

建设电影网站,中小型电子商务网站,罗湖公司网站建设,2024年1月新冠高峰这个系列主要记录C模板元编程的常用语法 文章目录 引言语法应用函数模板可变参数的打印可变参数的最小/最大函数 类模板 参考文献 引言 在C11之前,函数模板和类模板只支持含有固定数量的模板参数。C11增强了模板功能,允许模板定义中包含任意个(包括0个)…

这个系列主要记录C++模板元编程的常用语法


文章目录

  • 引言
  • 语法
  • 应用
    • 函数模板
      • 可变参数的打印
      • 可变参数的最小/最大函数
    • 类模板
  • 参考文献


引言

在C++11之前,函数模板和类模板只支持含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含任意个(包括0个)模板参数,即可变参数模板。


语法

template<typename... Types>

其中 ... 可接纳的模板参数>=0
如果不希望产生模板参数个数为0的变长参数模板,则可以采用以下定义:

template<typename Head, typename... Tail>

由于多了Head类型,该模板必须有一个及以上的模板参数。


应用

函数模板

可变参数的打印

函数模板中一种常见的使用可变参数模板的场景是以递归的方式取出可用参数:

#include <iostream>void print() {}template<typename T, typename... Types>
void print(const T& firstArg, const Types&... args) {std::cout << firstArg << " " << sizeof...(args) << std::endl;print(args...);
}template <typename... Types>
void print(const Types&... args) {std::cout << "print(...)" << std::endl;
}int main(int argc, char* argv[]) {print(3.0f, "hello world", 10);return 0;
}

上面例子表示我们想要输出一个单精度浮点值+字符串+整型值:

  • 上面的 void print() {} 代表模板递归的终止。
  • print(args...) 展开参数,向下模板递归。
  • sizeof...(args) 得到参数的个数。

最终输出为

考虑如下情况,如果除了有上面的模板,我们还定义了一个完全泛化的模板:

template <typename... Types>
void print(const Types&... args) {std::cout << "print(...)" << std::endl;
}

那么输出结果是怎么样的?
答案是还是输出上面的值,这是因为编译器对于偏泛化和偏特化都满足的情况,会选择偏特化的模板。


可变参数的最小/最大函数

有时我们想得到可变参数的最小/最大函数,可以如下实现:

#include <iostream>template <typename T>
T m_min(T value) {return value;
}template <typename T, typename... Types>
T m_min(T value, Types... args) {return std::min(value, m_min(args...));
}int main(int argc, char *argv[]) {std::cout << my_min(4, 3, 1, 2) << std::endl;return 0;
}

类模板

可变参数模板也可以用于类模板中,比如STL中的tuple

#include <iostream>template<typename... Values> class tuple;
template<> class tuple<> {};template<typename Head, typename... Tail>
class tuple<Head, Tail...>: private tuple<Tail...>
{typedef tuple<Tail...> inherited;
public:tuple() {}tuple(Head v, Tail... vtail) : m_head(v), inherited(vtail...) {}Head& head() { return m_head; }inherited& tail() { return *this; }
protected:Head m_head;
};int main(int argc, char* argv[]) {tuple<float, std::string, int> t(3.0f, "hello world", 10);std::cout << t.head() << " " << t.tail().head() << " " << t.tail().tail().head() << std::endl;return 0;
}

通过可变参数模板,实现递归继承,根基类为 template<> class<>{},父类成员在内存中位于子类成员之前。

这里的输出为


参考文献

【C++】C++11可变参数模板(函数模板、类模板)

http://www.yayakq.cn/news/980240/

相关文章:

  • 网站seo优化综合服务公司哪家好支付网站建设费怎么做账
  • 网站做cpa赚钱东莞洪梅网站建设
  • wordpress做网站手机公司网站设计公司排名
  • 专业的网站建设联系方式免费注册域名和空间
  • 在网上做贸易哪个网站好用媒体做响应式网站可以吗
  • 建网站pc版网站源代码 php
  • 怎么通过数据库做网站的登录跨境电商营销推广
  • 管理系统网站开发网站建设艾金手指六六12
  • 温州商城网站建设电商营销型网站建设
  • 推广网站实例企业营销型展厅设计价目表
  • 郑州制作网站软件php做的大型网站有哪些
  • 门户网站建设公司wordpress制作评论
  • 深圳做网站公司有那些想自己做个网站在哪里做
  • 只有域名如何做网站建设一个购物网站需要什么意思
  • 漳州建网站python 网站开发 linux
  • 深圳网站建设公司模板重庆建站公司哪个好
  • 包头网站建设奥北微信小程序怎么做成链接
  • 大型手机网站制作河南做网站需要多少钱
  • 不能打开建设银行网站怎么办企业网站推广定义
  • 网站源码下载 用户注册淘宝客网站域名备案吗
  • 松原市住房和城乡建设局网站域名不转出可以做网站吗
  • 智能建站的优势和不足国内大宗商品交易平台
  • 做网站就必须要开公司吗网站免费建站方法
  • 安吉哪里做网站好学编程用什么笔记本电脑好
  • 阿里云网站建设——部署与发布中国纪检监察报什么级别
  • 沙坪坝集团网站建设360网站图标怎么做
  • 做网站运营需要学什么均安建网站
  • 淘宝的好券网站怎么做网络广告的收费模式有
  • 怎么推广网站建设业务广州网站seo公司
  • jsp网站开发实现增删改查个性化网站设计