C++ 模板固定+;可变大小类

C++ 模板固定+;可变大小类,c++,templates,containers,C++,Templates,Containers,假设我有几个容器类,如下所示: template<typename T> class Container { /* ... */ }; template<typename T, size_t> class Array : public Container<T> { /* Fixed-sized Container */ }; template<typename T> class Vector : public Container

假设我有几个容器类,如下所示:

template<typename T> class Container
{
    /* ... */
};

template<typename T, size_t> class Array : public Container<T>
{
    /* Fixed-sized Container */
};

template<typename T> class Vector : public Container<T>
{
    /* Variable-sized Container */
};
模板类容器
{
/* ... */
};
模板类数组:公共容器
{
/*固定尺寸集装箱*/
};
模板类向量:公共容器
{
/*可变尺寸容器*/
};
我有一个类,它接受其中一个作为模板参数:

template<typename T, template<typename> class U, size_t M> class Polygon
{
    U<T> Vertices; // Problem, what if user passes Array (it needs 2 parameters)
    U<T, M> Vertices; // Problem, what if the user wants to use a variable-sized container (it needs only 1 parameter)
};
模板类多边形
{
U顶点;//问题,如果用户通过数组(它需要2个参数)怎么办
U顶点;//问题,如果用户想要使用可变大小的容器(它只需要1个参数),该怎么办
};
我的问题是,我能否(可能是通过巧妙的模板参数魔术)让消费类接受任何类型的容器(固定或可变大小,即使有不同的模板签名)


关于模板签名的唯一保证是,如果它是一个固定大小的容器,它将有两个参数
,如果它是一个可变大小的容器,它将有一个参数

,这比你想象的要简单得多。您可以仅在容器本身上创建模板:

template <class Container>
class Polygon {
    Container vertices;
};
模板
类多边形{
容器顶点;
};
这将适用于满足您的容器要求的任何东西,无论大小是否固定


为容器选择正确的模板参数的问题被转移到实例化点,在这里,参数和类型无论如何都必须是已知的。

这比您想象的要简单得多。您可以仅在容器本身上创建模板:

template <class Container>
class Polygon {
    Container vertices;
};
模板
类多边形{
容器顶点;
};
这将适用于满足您的容器要求的任何东西,无论大小是否固定

为容器选择正确模板参数的问题被转移到实例化点,在实例化点中,参数和类型无论如何都必须是已知的