模板类,它根据模板参数包装类型的容器

时间:2014-11-02 12:27:34

标签: c++ templates specialization

我想有一个包装容器的模板类,但我想根据模板参数的值选择要包装的容器。 类似的东西:

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

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

但避免模板专业化涉及的所有代码重复。我试图看看std::enable_if是否可以帮助我做一些技巧,但我没有想到任何办法。

2 个答案:

答案 0 :(得分:4)

可以将std::conditional用作Nawaz 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;
} ;

答案 1 :(得分: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;
};