我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;
};
你應該不需要的情況。那麼你有什麼模棱兩可的嗎? –