内容简介:May 29th, 2020C++11 introduced variadic templates and template parameter packs.Passing template parameter packs around is a bit of a hassle, because the dots “soak up” parameters, which make them hard to pass to other templated types. You also can’t “save”
Raymond
May 29th, 2020
C++11 introduced variadic templates and template parameter packs.
template<typename... Args> struct S;
Passing template parameter packs around is a bit of a hassle, because the dots “soak up” parameters, which make them hard to pass to other templated types. You also can’t “save” parameter packs in another type:
template<typename... Args> struct S { // doesn't compile: cannot create a type that // is itself a parameter pack using TheArgs = Args...; };
One workaround for this is to capture the types into a std::tuple
.
template<typename... Args> struct S { using Tuple = std::tuple<Args...>; };
You can then pass the Tuple
around, and if you need to extract the types, you can pull them out of the tuple.
My first thought about how to extract the types was to use std::get
:
// code in italics is wrong template<typename... Args> struct Traits { using Tuple = std::tuple<Args...>; static constexpr auto Size = sizeof...(Args); template <std::size_t N> <i>using Nth = decltype(std::get<N>(std::declval<Tuple>()));</i> using First = Nth<0>; using Last = Nth<Size - 1> };
This doesn’t work because std::get
returns a reference:
void f() { whatis<Traits<int, double>::First>(); } call void whatis<int&&>()
This behavior is presumably so you can modify the tuple:
std::tuple<int> tuple; std::get<0>(tuple) = 2;
Fortunately, there’s another way to extract the type from a tuple: std::tuple_element
.
template<typename... Args> struct Traits { using Tuple = std::tuple<Args...>; template <std::size_t N> using Nth = typename std::tuple_element<N, Tuple>::type; using First = Nth<0>; using Last = Nth<Size - 1> };
This provides a simpler way to extract the last type from a template parameter pack than writing some horrible recursive template metaprogram, which is what some people did instead of hiding the pack inside a tuple.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人人都是产品经理2.0
苏杰 / 电子工业出版社 / 2017-5 / 66.6
《人人都是产品经理2.0——写给泛产品经理》继续定位在-1~3 岁的产品经理。这里特别要强调,“-1 岁”指的是“泛产品经理”群体,比如自认为是“产品新人”的“职场老人”,需要自己做产品的早期创业者,对产品感兴趣并且工作中可能要承担部分职责的技术、设计、运营等人员,其他行业对互联网产品感兴趣的从业者等,《人人都是产品经理2.0——写给泛产品经理》可以说是为他们量身定做的。 内容方面,《人人都......一起来看看 《人人都是产品经理2.0》 这本书的介绍吧!
RGB HSV 转换
RGB HSV 互转工具
HEX CMYK 转换工具
HEX CMYK 互转工具