首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Loki IndexOf在TypeList中的实现

Loki IndexOf在TypeList中的实现
EN

Stack Overflow用户
提问于 2012-05-16 19:47:26
回答 1查看 723关注 0票数 1

我在基于Loki的基础上实现了一个基于以下内容的TypeList:

http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s09.html

并从IndexOf站点中看到以下代码(在打字员中查找类型的索引):

代码语言:javascript
复制
template <class T>
struct IndexOf< NullType, T>
{
    enum { value = -1 };
};

template <class T, class Tail>
struct IndexOf< Typelist<Head, Tail>, T>
{
private:
    enum { temp = IndexOf<Tail, T>::value };
public:
    enum { value = (temp == -1) ? -1 : 1+temp };
};

这似乎行不通,因为在递归遍历列表时,我没有看到比较T的东西。在我的实现中,如下所示:

代码语言:javascript
复制
template<typename Tlist, typename T>
struct IndexOf
{
private:
  static const int temp = IndexOf<typename Tlist::Tail, T>::value;
public:
  static const int value = (temp == -1) ? -1 : 1 + temp;
};

template<typename T>
struct IndexOf<NullType, T>
{
  static const int value = -1;
};

而且,事实上,总是返回-1。如果我想一想,假设一个人有TypeList,那么尾巴将是NullType,所以温度是-1,如果头是char的话,那么值就是-1..even,如果Head是char,我会期望为零。我在这里错过了什么?

谢谢

我对“台风”的实施只是:

代码语言:javascript
复制
template<typename H, typename T>
struct Typelist
{
  typedef H Head;
  typedef T Tail;
};

我猜这不是洛基斯,但有了乔尔的回答,我得到的答案是:

代码语言:javascript
复制
template<typename Head, typename Tail, typename T>
struct IndexOfImpl
{
private:
  static const int temp = IndexOfImpl<typename Tail::Head, typename Tail::Tail, T>::value;
public:
  static const int value = (temp == -1) ? -1 : temp + 1;
};

template<typename T, typename Tail>
struct IndexOfImpl<T, Tail, T>
{
  static const int value = 0;
};

template<typename T>
struct IndexOfImpl<T, NullType, T>
{
  static const int value = 0;
};

template<typename Head, typename T>
struct IndexOfImpl<Head, NullType, T>
{
  static const int value = -1;
};

template<typename Tlist, typename T>
struct IndexOf
{
 public:
  static const int value = IndexOfImpl<typename Tlist::Head, typename Tlist::Tail, T>::value;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-16 19:54:09

应:

代码语言:javascript
复制
template <class T>
struct IndexOf< NullType, T>
{
    enum { value = -1 };
};

template <class T, class Head, class Tail>
struct IndexOf< Typelist<Head, Tail>, T>
{
private:
    enum { temp = IndexOf<Tail, T>::value };
public:
    enum { value = (temp == -1) ? -1 : 1+temp };
};

template <class T, class Tail>
struct IndexOf< Typelist<T, Tail>, T>
{
public:
    enum { value = 0 };
};

在列表的递归编码中,您试图在某个位置找到T。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10625637

复制
相关文章

相似问题

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