内容简介: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.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C# 6.0本质论
[美] Mark Michaelis(马克·米凯利斯)、[美] Eric Lippert(埃里克·利珀特) / 周靖、庞燕 / 人民邮电出版社 / 2017-2-1 / 108
这是C#领域中一部广受好评的名作,作者用一种易于理解的方式详细介绍了C#语言的各个方面。全书共有21章和4个附录(其中哟2个附录从网上下载),介绍了C#语言的数据类型、操作符、方法、类、接口、异常处理等基本概念,深入讨论了泛型、迭代器、反射、线程和互操作性等高级主题,还介绍了LINQ技术,以及与其相关的扩展方法、分部方法、Lambda表达式、标准查询操作符和查询表达式等内容。每章开头的“思维导图”......一起来看看 《C# 6.0本质论》 这本书的介绍吧!
JSON 在线解析
在线 JSON 格式化工具
图片转BASE64编码
在线图片转Base64编码工具