首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将TypeList还原回原始参数包

如何将TypeList还原回原始参数包
EN

Stack Overflow用户
提问于 2016-10-17 23:21:23
回答 1查看 164关注 0票数 1

我很难找到有关如何使用c++11变量TypeLists作为可移植参数包容器的信息。假设我有这段代码。

代码语言:javascript
复制
#include <type_traits>

template <typename T, typename... Ts>
struct Index;

template <typename T, typename... Ts>
struct Index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};

template <typename T, typename U, typename... Ts>
struct Index<T, U, Ts...> : std::integral_constant<std::size_t, 1 + Index<T, Ts...>::value> {};

我可以使用它在这样的参数包中找到一个类型的第一个索引。

代码语言:javascript
复制
int main() 
{
using namespace std;

cout << Index<int, int>::value << endl;                //Prints 0
cout << Index<char, float, char>::value << endl;       //Prints 1
cout << Index<int, double, char, int>::value << endl;  //Prints 2
}

对于TypeList,我如何实现这种行为?我想创造出这样的东西。

代码语言:javascript
复制
template <typename ...>
struct TypeList {};

int main() 
{
using namespace std;
using List = TypeList<char, short, long>

cout << Index<short, ConvertToParameterPack<List>::types...>::value << endl;  //Prints 1
}

其中,ConvertToParameterPack是某种将TypeList还原回其ParameterPack的方法。如果我要求的是不可能的话,还有什么好办法来解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-18 09:37:55

代码语言:javascript
复制
template<std::size_t I>
using index_t=std::integral_constant<std::size_t,I>;

template<class T, class List>
struct Index{}; 

template<class T, class...Ts>
struct Index<T, TypeList<T,Ts...>>:
  index_t<0>
{};

template<class T,class U, class...Ts>
struct Index<T, TypeList<U,Ts...>>:
  index_t< 1+Index<T,TypeList<Ts...>::value >
{}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40097153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档