2012-05-16 61 views
1

我implenting基於洛基類型串的基礎上,從閱讀:實施洛基的IndexOf的一個類型串

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..even如果Head是char並且我預期爲零。我在這裏錯過了什麼?

感謝


我的類型串執行僅僅是:

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

您嘗試在列表的遞歸編碼中的某個Head處找到T.

+0

謝謝!從我的Typelist的簡單實現中,我必須將其轉換爲上面的內容(編輯爲我的答案) –