gpt4 book ai didi

c++ - 为 TypeList 实现 Loki IndexOf

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:02 26 4
gpt4 key购买 nike

我正在实现一个基于 Loki 的 TypeList,基于阅读:

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

并从 IndexOf 网站上看到这段代码(在类型列表中查找类型的索引):

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 的东西。在我的实现中,它看起来像这样:

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;然后 Tail 将是 NullType,因此通过特化,temp 将是 -1,然后 value 将是 -1.. 即使 Head 是 char,我会期望为零。我在这里缺少什么?

谢谢


我对 Typelist 的实现仅仅是:

template<typename H, typename T>
struct Typelist
{
typedef H Head;
typedef T Tail;
};

我猜这不是 Lokis,但根据 Joel 的回答,我得到了它:

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;
};

最佳答案

应该是:

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 };
};

您尝试在列表的递归编码中的某个 Head 处找到 T。

关于c++ - 为 TypeList 实现 Loki IndexOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com