gpt4 book ai didi

c++ - 非递归获取可变参数模板最后类型的通用类型特征?

转载 作者:行者123 更新时间:2023-12-03 06:55:51 24 4
gpt4 key购买 nike

<分区>

注意事项:

我关心的是编译速度。

我假设递归类型特征通常比替代方案慢(如果可能)。如果我对此有误,请告诉我。


我们可以在不递归的情况下访问可变列表前面的类型,如下所示:

#include <iostream>
#include <type_traits>

template <typename T>
struct this_type
{
using type = T;
};

template <typename T1, typename ...>
struct front : this_type<T1> {};

template <typename ... Ts>
using front_t = typename front<Ts...>::type;

template <typename ... Ts>
void Foo ()
{
std::cout << std::is_same_v<front_t<Ts...>, int> << std::endl;
}

int main ()
{
Foo<int, char, bool>();
}

但是,我想不出一种通用 方法来访问返回类型而无需递归。直觉上我想做这样的事情:

template <typename ...>
struct pack;

template <typename ...>
struct back;

template <typename Tn, typename ... Ts>
struct back <pack<Ts..., Tn>> : this_type<Tn> {};

template <typename ... Ts>
using back_t = typename back<pack<Ts...>>::type;

...但是可变参数模板需要是特化中的最后一个参数。

我们可以使用一些代码膨胀来管理达到一定数量的访问元素。例如,3:

template <typename ...>
struct back;

template <typename T1>
struct back <T1> : this_type<T1> {};

template <typename T1, typename T2>
struct back <T1, T2> : this_type<T2> {};

template <typename T1, typename T2, typename T3>
struct back <T1, T2, T3> : this_type<T3> {};

template <typename ... Ts>
using back_t = typename back<Ts...>::type;

template <typename ... Ts>
void Foo ()
{
std::cout << std::is_same_v<back_t<Ts...>, bool> << std::endl;
}

int main ()
{
Foo<int, char, bool>();
}

...但是有没有一种不用递归的通用方法呢?


动机:

通常我们可以改变解决问题的方式,这样我们就可以从可变列表的前面访问,但有时不可避免地从后面访问。如果有一些我没有利用的语言特性,我不想为编译器创建无用的工作。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com