2014-04-04 42 views
0

我做一些模板元編程,我有這樣的情況,首先我有幾類,如: -幾個級別的嵌套模板。我如何得到這個工作?

template <typename Q> 
struct Object { 
public: 
    Q data; 
}; 

template <typename P> 
class CircleObject : public Object<const typename P::Circle> { 
}; 

template <typename P> 
class SquareObject : public Object<const typename P::Circle> { 
}; 

template <typename P> 
class Storage { 
public: 
    typedef CircleObject<P> MyCircle; 
    typedef SquareObject<P> MySquare; 
}; 

現在,我正在試圖確定這些物體本身的一些特點: -

template <typename P> 
struct CircleTraits<Storage<P> > { 
    template <typename otype> 
    struct IsCircle { 
    static const bool VALUE = false; 
    }; 
}; 

template <typename P> 
struct CircleTraits<Storage<P> >::IsCircle<Storage<P>::MyCirlce> { 
    static const bool VALUE = true; 
}; 

但是,這是不正確的(編譯錯誤)。我嘗試了一種將類型名稱和模板參數放在每個地方的試驗和錯誤方法,但沒有對模板特化的深入理解,我沒有真正能夠解決這個問題。有人可以幫忙嗎?

什麼我希望在以後的功能實現是一樣的東西: -

typedef Storage<RedObjects> RedStorage; 

template <typename SpecializedStorage> 
class Processor { 
    typedef CircleTraits<typename SpecializedStorage> MyCircleTraits; 

    template <typename ObjectType> 
    void foo(ObjectType& data); 
}; 

template <typename SpecializedStorage> 
template <typename ObjectType> 
void foo(ObjectType& data) { 
    if (MyCircleTraits::template IsCircle<ObjectType>::VALUE) { 
    // do something about the damn circles 
    } 
} 
+1

我不清楚你要做什麼。 – Danvil

+1

您的意思是'template struct Object'? – sehe

+0

@sehe是的,這是一個錯字。修復。 – owagh

回答

1

我想你不能那樣做,你或許應該使用SFINAE來解決這樣的事情:

//C++11 version 
template<typename T> 
struct IsCircle 
{ 
private: 
    template<typename Z> 
    constexpr static bool _is(typename Z::MyCirlce*) //if Z dont have `MyCirlce` then this function is removed 
    { 
     return true; 
    } 
    template<typename Z> 
    constexpr static bool _is(...) //fallback function 
    { 
     return false; 
    } 
public: 
    static const bool VALUE = _is<T>(nullptr); 
}; 

//C++98 version 
template<typename T> 
struct IsCircle 
{ 
private: 
    struct a { char a; }; //size ~1 
    struct b { char a[8]; }; //size ~8 
    template<typename Z> 
    static b _is(typename Z::MyCirlce*); 
    template<typename Z> 
    static a _is(...); 
public: 
    static const bool VALUE = sizeof(_is<T>(0)) == sizeof(b); 
}; 
+0

我真的沒有在我們的環境中訪問C++ 11 ......這將解決很多問題... – owagh

+0

現在我也有C++ 98版本 – Yankes

相關問題