从模板化模板类和可变参数模板声明“容器”对象

时间:2015-04-03 09:26:31

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

我需要声明一个可以存储不同类型容器的类。即如果它可以处理std :: bitset和std :: array会很好。 但是,这两个类需要不同的模板参数...... 是否有可能(以及可能,如何)使用模板化模板类和可变参数模板来声明这种类?

示例(但错误):

template<template <typename..., std::size_t> class Container,
         std::size_t N,
         typename... Args>
class Base_Class
{
    ...
    Container<Args..., N/2> container;
};

编译器抱怨 N / 2 不是类型。显然,对于std :: array和std :: bitset,我需要将大小作为最后一个模板参数......是否可以编码这种疯狂?

谢谢!

编辑: 就我而言,主要问题是可变参数模板只能在右侧扩展,因此可变参数必须是最后一个。任何人都知道是否有任何计划允许在C ++ 17中使用以下语法?

template<typename... Args, typename T>
struct A
{};

2 个答案:

答案 0 :(得分:3)

通过使用模板模板参数ResizedContainer

,可以使Anton的回答更少容器特定
namespace detail {
    template<typename Container>
    struct ResizedContainer;

    template<template<typename,std::size_t> class Container,
             typename T, std::size_t N>
    struct ResizedContainer<Container<T,N>> {
        using type = Container<T,N/2>;
    };

    template<template<std::size_t> class Container,
             std::size_t N>
    struct ResizedContainer<Container<N>> {
        using type = Container<N/2>;
    };
}

#include <array>
#include <bitset>

template<typename Container>
class Base_Class {
    typename detail::ResizedContainer<Container>::type container;
};

int main() {
    Base_Class<std::array<int,4>> a;
    Base_Class<std::bitset<5>> b;
}

答案 1 :(得分:2)

也许是这样的:

namespace detail {
    template<typename Container>
    struct ResizedContainer;

    template<typename T, size_t N>
    struct ResizedContainer<std::array<T, N>> {
        using type = std::array<T, N/2>;
    };

    template<size_t N>
    struct ResizedContainer<std::bitset<N>> {
        using type = std::bitset<N/2>;
    };
}

template<typename Container>
class Base_Class {
    typename detail::ResizedContainer<Container>::type container;
};

int main() {
    Base_Class<std::array<int, 4>> a;
    Base_Class<std::bitset<5>> b;
}