一个非递归地获得可变模板的最后一个类型的泛型类型特征



注意:

我关心的是编译的速度。

我假设递归类型特征通常比备选类型慢(如果可能的话(。如果我错了,请告诉我。


我们可以访问变量列表前面的类型,而无需递归,如下所示:

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

但是,有没有一种方法可以在不递归的情况下通用地做到这一点?


动机:

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

我会利用std::tuple来完成大部分繁重的工作。

template<typename... Ts>
using back_t = std::tuple_element_t<std::tuple<Ts...>, sizeof...(Ts) - 1>;

相关内容

最新更新