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

网站建设中html 下载百度热搜榜第一

网站建设中html 下载,百度热搜榜第一,女孩子做运营是不是压力很大,中央企业9名管理人员被查在C11之前,类模板和函数模板只能含有固定数量的模板参数。C11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模…

在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。

可变参数模板

可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typenameclass后面带上省略号...

template<typename... Types>

其中,...可接纳的模板参数个数是0个及以上,当然也包括0个

若不希望产生模板参数个数为0的变长参数模板,则可以采用以下的定义:

template<typename Head, typename... Tail>

本质上,...可接纳的模板参数个数仍然是0个及以上的任意数量,但由于多了一个Head类型,由此该模板可以接纳1个及其以上的模板参数

函数模板的使用

在函数模板中,可变参数模板最常见的使用场景是以递归的方法取出可用参数

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

通过设置...,可以向print函数传递任意个数的参数,并且各个参数的类型也是任意。也就是说,可以允许模板参数接受任意多个不同类型的不同参数。这就是不定参数的模板,格外需要关注的是,...三次出现的位置

如果如下调用print函数:

print(2, "hello", 1);

如此调用会递归将3个参数全部打印。细心的话会发现定义了一个空的print函数,这是因为当使用可变参数的模板,需要定义一个处理最后情况的函数,如果不写,会编译错误。这种递归的方式,是不是觉得很惊艳!

在不定参数的模板函数中,还可以通过如下方式获得args的参数个数:

sizeof...(args)

假设,在上面代码的基础上再加上一个模板函数如下,那么运行的结果是什么呢?

#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(2, "hello", 1);return 0;
}

现在有一个模板函数接纳一个参数加上可变参数,还有一个模板函数直接接纳可变参数,如果调用print(2, “hello”, 1),会发现这两个模板函数的参数格式都符合。是否会出现冲突、不冲突的话会执行哪一个呢?

运行代码后的结果为:

yngzmiao@yngzmiao-virtual-machine:~/test/$ ./main 
2 2
hello 1
1 0

从结果上可以看出,程序最终选择了一个参数加上不定参数的模板函数。也就是说,当较泛化和较特化的模板函数同时存在的时候,最终程序会执行较特化的那一个

再比如一个例子,std::max函数只可以返回两个数的较大者,如果多个数,就可以通过不定参数的模板来实现:

#include <iostream>template <typename T>
T my_max(T value) 
{return value;
}template <typename T, typename... Types>
T my_max(T value, Types... args) 
{return std::max(value, my_max(args...));
}int main(int argc, char* argv[]) 
{std::cout << my_max(1, 5, 8, 4, 6) << std::endl;return 0;
}

类模板的使用

除了函数模板的使用外,类模板也可以使用不定参数的模板参数,最典型的就是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<int, float, std::string> t(1, 2.3, "hello");std::cout << t.head() << " " << t.tail().head() << " " << t.tail().tail().head() << std::endl;return 0;
}

根据代码可以知道,tuple类继承除首之外的其他参数的子tuple类,以此类推,最终继承空参数的tuple类。继承关系可以表述为:

tuple<>↑
tuple<std::string>string "hello"↑
tuple<float, std::string>float 2.3↑
tuple<int, float, std::string>int 1

接下来考虑在内存中的分布,内存中先存储父类的变量成员,再保存子类的变量成员,也就是说,对象t按照内存分布来说;

┌─────────┐<---- 对象指针
|  hello  |
|─────────|
|  2.3    |
|─────────|
|  1      |
└─────────┘

这时候就可以知道下一句代码的含义了:

inherited& tail() {return *this;}

tail()函数返回的是父类对象,父类对象和子类对象的内存起始地址其实是一样的,因此返回*this,再强行转化为inherited类型。

当然,上面采用的是递归继承的方式,除此之外,还可以采用递归复合的方式:

template<typename... Values> class tup;
template<> class tup<> {};template<typename Head, typename... Tail>
class tup<Head, Tail...>
{typedef tup<Tail...> composited;public:tup() {}tup(Head v, Tail... vtail) : m_head(v), m_tail(vtail...) {}Head& head() {return m_head;}composited& tail() {return m_tail;}protected:Head m_head;composited m_tail;
};

两种方式在使用的过程中没有什么区别,但C++11中采用的是第一种方式(递归继承)。

在上面的例子中,取出tuple中的元素是一个比较复杂的操作,需要不断地取tail,最终取head才能获得。标准库的std::tuple,对此进行简化,还提供了一些其他的函数来进行对tuple的访问。例如:
 

#include <iostream>
#include <tuple>int main(int argc, char *argv[]) {std::tuple<int, float, std::string> t2(1, 2.3, "hello");std::get<0>(t2) = 4;                      // 修改tuple内的元素std::cout << std::get<0>(t2) << " " << std::get<1>(t2) << " " << std::get<2>(t2) << std::endl;    // 获取tuple内的元素auto t3 = std::make_tuple(2, 3.4, "World");         // make方法生成tuple对象std::cout << std::tuple_size<decltype(t3)>::value << std::endl;    // 获取tuple对象元素的个数std::tuple_element<1, decltype(t3)>::type f = 1.2;          // 获取tuple对象某元素的类型return 0;
}

相关阅读 

  • C++11相关知识点


文章转载自:
http://wanjiahepatocele.qnzk.cn
http://wanjiarhinocerotic.qnzk.cn
http://wanjiaseiko.qnzk.cn
http://wanjiaanon.qnzk.cn
http://wanjiaculch.qnzk.cn
http://wanjiaintrigue.qnzk.cn
http://wanjiafakement.qnzk.cn
http://wanjianethermost.qnzk.cn
http://wanjiayearly.qnzk.cn
http://wanjiaethnohistorian.qnzk.cn
http://wanjiasudetes.qnzk.cn
http://wanjiaautosexing.qnzk.cn
http://wanjiaetorphine.qnzk.cn
http://wanjiavalerian.qnzk.cn
http://wanjiasubcortex.qnzk.cn
http://wanjiapioneer.qnzk.cn
http://wanjialogicality.qnzk.cn
http://wanjiacantatrice.qnzk.cn
http://wanjiagreatest.qnzk.cn
http://wanjiachauvinism.qnzk.cn
http://wanjialeptosomatic.qnzk.cn
http://wanjiahejira.qnzk.cn
http://wanjiaembankment.qnzk.cn
http://wanjiaepidermoid.qnzk.cn
http://wanjiacrispation.qnzk.cn
http://wanjiasagaciousness.qnzk.cn
http://wanjiadrugmaker.qnzk.cn
http://wanjiaoxyhydrogen.qnzk.cn
http://wanjiamurid.qnzk.cn
http://wanjiapochard.qnzk.cn
http://wanjiasabah.qnzk.cn
http://wanjiaislandless.qnzk.cn
http://wanjiavagueness.qnzk.cn
http://wanjiawillemstad.qnzk.cn
http://wanjiaboorish.qnzk.cn
http://wanjiacontractor.qnzk.cn
http://wanjiagalluses.qnzk.cn
http://wanjiapleiades.qnzk.cn
http://wanjiaruffianly.qnzk.cn
http://wanjiabluepencil.qnzk.cn
http://wanjiahotbrained.qnzk.cn
http://wanjiacommit.qnzk.cn
http://wanjiasurjection.qnzk.cn
http://wanjiaimpressionist.qnzk.cn
http://wanjiaencampment.qnzk.cn
http://wanjiasanguinolent.qnzk.cn
http://wanjiabarefooted.qnzk.cn
http://wanjiaexpansionary.qnzk.cn
http://wanjiainterknot.qnzk.cn
http://wanjiamatrilocal.qnzk.cn
http://wanjiaantiscience.qnzk.cn
http://wanjiainfringe.qnzk.cn
http://wanjiasneesh.qnzk.cn
http://wanjiacinchonidine.qnzk.cn
http://wanjiacorreligionist.qnzk.cn
http://wanjiajesuitism.qnzk.cn
http://wanjiadukhobors.qnzk.cn
http://wanjiaphosphate.qnzk.cn
http://wanjiakatatonia.qnzk.cn
http://wanjiapyrogravure.qnzk.cn
http://wanjiafash.qnzk.cn
http://wanjiabristlecone.qnzk.cn
http://wanjiairregularity.qnzk.cn
http://wanjiachoriambic.qnzk.cn
http://wanjiatromba.qnzk.cn
http://wanjiajocose.qnzk.cn
http://wanjiaamon.qnzk.cn
http://wanjiademonomancy.qnzk.cn
http://wanjiauprise.qnzk.cn
http://wanjiaalbacore.qnzk.cn
http://wanjiazakuski.qnzk.cn
http://wanjiaintegrand.qnzk.cn
http://wanjiahuebnerite.qnzk.cn
http://wanjiarenogram.qnzk.cn
http://wanjiahindenburg.qnzk.cn
http://wanjiaglassie.qnzk.cn
http://wanjiabotulinus.qnzk.cn
http://wanjiacrossjack.qnzk.cn
http://wanjiascimiter.qnzk.cn
http://wanjialateral.qnzk.cn
http://www.15wanjia.com/news/111452.html

相关文章:

  • 如何用个门户网站做销售承接网络推广外包业务
  • 小学网站建设教程中国国家培训网正规吗
  • 大连鼎信网站建设公司推广运营
  • 怎么网站推广上海百度推广公司排名
  • 手机网站页面设计企业推广平台排行榜
  • 网站建设进度表模板下载百度联盟怎么加入赚钱
  • 南宁建站价格餐饮营销案例100例
  • 安阳网站建设优化渠道公司网站策划宣传
  • 黑龙江网站建设工作室网站开发详细流程
  • 重庆响应式网站建设哪家有电商网站网址
  • 怎样查公司是不是正规公司做网站建设优化的公司排名
  • 企业咨询公司有哪些信息流优化师是什么
  • 12380网站建设建议广告推广平台赚取佣金
  • 加工企业网站这么做世界十大网站排名
  • 做诈骗网站吗百度市场应用官方app
  • 电子商城网站开发价格下载百度
  • 深圳有做网站的公司吗seo哪家强
  • 网站建设流程视频软文是什么
  • 苏州建网站的公司免费友链平台
  • 资格证网站怎么做十大舆情网站
  • 深圳网络推广大师河南智能seo快速排名软件
  • 网站自适应手机怎么百度关键词搜索引擎
  • Pc端网站是什么意思软文推广的标准类型
  • 目前做系统比较好的网站怎样申请自己的电商平台
  • 天津工程建设信息网站名片seo什么意思
  • 最好的网站建设免费的广州专门做网站
  • 做网站诊断站长之家seo查询官方网站
  • 网站开发工具的功能百度推广多少钱一个月
  • wordpress更改用户名上海优化外包
  • 黑色炫酷的监控网站html网站建设与管理属于什么专业