【发布时间】:2020-10-21 08:07:06
【问题描述】:
注意:
我关心的是编译速度。
我假设递归类型特征通常比替代方法慢(如果可能)。如果我对此有误,请告诉我。
我们可以在不递归的情况下访问可变参数列表前面的类型,如下所示:
#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>();
}
...但是有没有办法在没有递归的情况下通用地做到这一点?
动机:
通常我们可以改变解决问题的方式,以便从可变参数列表的前面附近访问,但有时从后面访问是不可避免的。如果有一些我没有利用的语言特性,我不想为编译器创建无用的工作。
【问题讨论】:
-
据我所知,这是一个骗局。如果我遗漏了什么,请告诉我,我会投票重新开放。
-
@cigen,你是对的。这个问题也有一个有希望的答案。谢谢!
标签: c++ c++17 variadic-templates template-meta-programming typetraits