2014-11-02 160 views
0

我想要一個包裝容器的模板類,但我想根據模板參數的值選擇要包裝哪個容器。 喜歡的東西:根據模板參數包裝類型容器的模板類

template<typename T> 
class A{ 
    std::vector<T> MyContainer; 
    // ... 
} 

template<> 
class A<bool>{ 
    std::deque<bool> MyContainer; 
    // ... 
} 

但避免所有的代碼重複該模板專業化涉及。我試圖看看std::enable_if是否可以幫助我做一些技巧,但我還沒有想到任何方法。

+1

什麼簡單地提供容器類型作爲另一個(依賴)模板參數? – 2014-11-02 12:28:53

+0

我不知道你的例子是否真實,但你必須知道'std :: vector '在STLibrary中已經不同了。 – Caduchon 2014-11-02 12:35:40

+1

@πάνταῥεῖ這太難看了。這個班的使用者不需要照顧那個。這是班級的業務,那麼班級應該照顧它。 – Kae 2014-11-02 12:35:42

回答

3

你可以這樣做:

typedef typename boost::mpl::if_c< 
    std::is_same<T, bool>::value, 
    std::deque<T>, 
    std::vector<T> 
>::type MyContainerType; 

reference

或者可以編寫自己:

typedef typename ContainerSelector<T>::type MyContainerType; 

其中:

template <typename T> 
struct ContainerSelector { 
    typedef std::vector<T> type; 
}; 

template <> 
struct ContainerSelector<bool> { 
    typedef std::deque<bool> type; 
}; 
+4

在C++標準庫中,你有'std :: conditional',可以用來代替'mpl :: if_c'。 – Nawaz 2014-11-02 12:37:12

+0

這適用於我。等待5分鐘。 Nawaz的評論很好,所以我不必使用Boost。 – Kae 2014-11-02 12:37:57

+0

@Nawaz哇不記得標準的人叫什麼了。謝謝。 – Barry 2014-11-02 12:48:49

4

可以使用std::conditionalNawaz said

#include <type_traits> 

template <typename T> 
using MyContainerType = typename std::conditional< 
         std::is_same<T, bool>::value, 
         std::deque<T>, 
         std::vector<T> 
         >::type ; 

template<typename T> 
class A{ 
    //std::vector<T> MyContainer; 
    // ... 
    MyContainerType<T> C; 
} ; 
+0

Demo [_'here'_](http://rextester.com/OAP23715) – P0W 2014-11-02 12:52:53

+1

順便說一句,現在你可以使用'std :: is_same {}'而不是'std :: is_same :: value'。 C++ 14已由GCC和Clang完全實現。 – Nawaz 2014-11-02 13:41:44