2012-05-16 13 views
1

Я implenting на TypeList, основанный на Локи, основанный на чтении из:Осуществление Loki IndexOf для 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 по специализации, а затем значение будет -1 .. даже если Head был char, и я ожидал бы нуль. Что мне здесь не хватает?

Благодаря


Моя реализация TypeList просто:

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

Я предполагаю, что это не Lokis, но с ответом Джоэла я получил эту работу для меня:

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

Вам не нужен корпус . Тогда у вас была какая-то двусмысленность? –

ответ

1

Должно быть:

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 в некоторой главе в рекурсивном кодировании списка.

+0

Спасибо! Из моей простой реализации Typelist мне пришлось перевести это на предыдущее (отредактируйте мой ответ) –

 Смежные вопросы

  • Нет связанных вопросов^_^