问题描述
注意:
我在这里担心的是 编译 的速度。
我假设递归类型特征通常比替代特征(如果可能)慢。如果我对此有误,请告诉我。
我们无需递归即可访问可变参数列表前面的类型,如下所示:
#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 (将#修改为@)