2010-11-23 74 views
0

你會寫下面的簡單容器任何其他方式,或者是完全合理的,因爲它是:這個容器的實現是否完全合理?

template <typename T, bool small_> 
struct TransType 
{ 
    typedef const T& param_type; 
}; 

template <typename T> 
struct TransType<T, true> 
{ 
    typedef const T param_type; 
}; 

template <class T> 
class Container:public TransType<T,sizeof(T)<=sizeof(void*)> { 
public: 
    param_type getVal(){ 
    return obj; 
    } 
    void setVal(param_type input){ 
    containment=input; 
    } 
private: 
    T containment; 
}; 
+1

`template void UB(){TransType * x = new Container ;刪除x; //未定義行爲}`:P(Base類或者需要公共虛擬析構函數或者受保護的非虛擬析構函數) – GManNickG 2010-11-23 17:56:51

+0

一個缺點是不能編譯;) – sth 2010-11-23 18:02:48

回答

1

調查Boost.CallTraits。即,boost::call_traits<T>::param_type

您不應該需要客戶端來指定類型是否很小,這是元函數的工作。也沒有必要繼承任何東西。

實際上您現在的代碼是不合格。因爲param_type不是依賴類型,所以查找是在不考慮基類的情況下完成的;並不會被發現。你需要明確地用基類限定它,添加一個using-directive或者重新定義它。

你只是想落得:

template <typename T> 
struct Container 
{ 
    //typedef typename boost::call_traits<T>::param_type param_type; 
    typedef typename TransType<T>::param_type param_type; 

    // ... 
}; 

通過:

namespace detail 
{ 
    template <typename T, bool small_> 
    struct TransType 
    { 
     typedef const T& param_type; 
    }; 

    template <typename T> 
    struct TransType<T, true> 
    { 
     typedef const T param_type; 
    }; 
} 

template <typename T> 
struct TransType<T> 
{ 
    typedef detail::TransType<T, sizeof(T)<=sizeof(void*)> param_type; 
}; 

現在的條件是自動的,而且也沒有基類的麻煩。

1

我不會從元函數繼承。

0

除了GMan關於需要以某種形式顯式析構函數的評論之外,增加的複雜性是否會使您獲得顯着的性能?標準庫似乎認爲用戶需要在容器中存儲適當的類型,以便在某些情況下複製不是瓶頸。