Hiding C++ template parameter packs in a tuple

栏目: IT技术 · 发布时间: 6年前

内容简介: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”
Hiding C++ template parameter packs in a tuple

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.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

素数之恋

素数之恋

(美)约翰·德比希尔 / 陈为蓬 / 上海科技教育出版社 / 2008-12-01 / 34.00元

1859年8月,没什么名气的32岁数学家黎曼向柏林科学院提交了一篇论文,题为“论小于一个给定值的素数的个数”。在这篇论文的中间部分,黎曼作了一个附带的备注——一个猜测,一个假设。他向那天被召集来审查论文的数学家们抛出的这个问题,结果在随后的年代里给无数的学者产生了近乎残酷的压力。时至今日,在经历了150年的认真研究和极力探索后,这个问题仍然悬而未决。这个假设成立还是不成立? 已经越来越清楚,......一起来看看 《素数之恋》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试