如何重新专门化模板?

时间:2016-11-19 18:08:56

标签: c++ c++11 templates template-specialization

我有一个模板:

template<class T>

我希望T成为一个专门的容器,例如std::array<int, 5>

而且,有了这个std::array<int, 5>,我想以某种方式制作一个看起来像这样的类型:std::array<std::pair<bool, int>, 5>

有可能吗?

我想,如果我能以某种方式从std::array中提取纯的非专业std::array<int, 5>,以及将此std::array专门化为参数包的参数,我可以这样做:< / p>

template<typename Container, typename T, typename ...Rest>
using rc = Container<std::pair<bool, T>, Rest...>;

using respecialized_container =
    rc<unspecialized_container, container_parameters>;

但是,要做到这一点,我需要有unspecialized_containercontainer_parameteres ...

我有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:4)

这是一个适用于std::array和简单标准库容器(只有两个参数的容器)的部分方法:

#include <array>
#include <memory>
#include <utility>

template <typename> struct boolpair_rebind;

template <typename C> using boolpair_rebind_t = typename boolpair_rebind<C>::type;

template <typename T, std::size_t N>
struct boolpair_rebind<std::array<T, N>>
{
    using type = std::array<std::pair<bool, T>, N>:
};

template <typename T, typename Alloc, template <typename, typename> class DynCont>
struct boolpair_rebind<DynCont<T, Alloc>>
{
    using NewT = std::pair<bool, T>;
    using type = DynCont<
                     NewT,
                     typename std::allocator_traits<Alloc>::rebind_alloc<NewT>>;
};

现在给出T = std::array<int, 5>,你得到

boolpair_rebind_t<T> = std::array<std::pair<bool, int>, 5>;

并且给定U = std::list<float>,你得到

boolpair_rebind_t<U> = std::list<std::pair<bool, int>>;

您可以通过添加boolpair_rebind的部分特化来逐个扩展到其他容器类模板。