模板化固定+可变大小类

时间:2016-08-01 15:35:45

标签: 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<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)
};

我的问题是,我可以以某种方式(可能通过棘手的模板参数魔术)使消费类接受任何类型的容器(固定或可变大小,即使有不同的模板签名)?

模板签名的唯一保证是,如果它是固定大小的容器,它将有2个参数<Type, Size>,如果它是可变大小的容器<Type>

,则为1个

1 个答案:

答案 0 :(得分:3)

这比你想象的要简单。你可以在容器本身上模板:

template <class Container>
class Polygon {
    Container vertices;
};

这适用于任何符合容器要求的产品,无论是否固定尺寸。

为容器选择正确的模板参数的问题被移动到实例化点,其中必须知道参数和类型。