通用类型特征以非递归方式获得可变参数模板的最后一种类型?

问题描述

注意:

我在这里担心的是 编译 的速度。

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


我们无需递归即可访问可变参数列表前面的类型,如下所示:

#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>();
}

但是,我想不出一种 泛型 的方法,无需递归即可访问back类型。凭直觉,我想做这样的事情:

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,bool>();
}

...但是有没有一种方法可以通用地做到而无需递归?


动机:

通常,我们可以更改解决问题的方式,以便我们从可变参数列表的最前面访问,但是有时不可避免地要从后面访问。如果某些语言功能我没有利用,我不想为编译器创建无用的工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)