首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板模板参数- std::array的扩展

模板模板参数- std::array的扩展
EN

Stack Overflow用户
提问于 2015-03-17 04:42:07
回答 2查看 568关注 0票数 0

我有一个关于模板模板参数的问题:

让我们考虑一下下面的类:

代码语言:javascript
复制
template<typename T, template<class, class=std::allocator<T> > class UnderlyingContainerType = std::vector>
class MyContainer
{
public:
    T Value1;
    T Value2;
    UnderlyingContainerType<T> Container;

    MyContainer() {}

    /* methods implementation goes here */
};

在这个例子中,MyContainer是一个容器,聊天使用一个底层的与STL兼容的容器来做任何事情。

将基础容器类型声明为模板模板参数,而不是常规的模板参数,可以方便地使用类MyContainer,例如:

代码语言:javascript
复制
    MyContainer<int> MCV; //implicitly using vector
    MyContainer<int, std::list> MCL; //no need to write std::list<int> thanks to the 
                                     //template template parameters

现在,虽然这可以很好地处理大多数STL容器,例如std::vector、std::deque、std::list等等,但它不能用于c++11中提供的std::array。

原因是std::array具有不同于向量的模板参数签名。具体地说,它们是:

代码语言:javascript
复制
std::vector<class T, class allocator = std::allocator<T> >
std::array<class T, int N>

我的问题是,是否有一种方法可以泛化类数组,以便底层容器也可以是std::MyContainer。

我要提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2015-03-17 05:27:07

vectorarray接口之间的共性仅限于元素类型。您的容器应该反映这一点:

代码语言:javascript
复制
template<typename T, template<typename> class underlying_container>
struct container
{
    underlying_container<T> storage;
};

现在的使用需要一个小技巧:

代码语言:javascript
复制
template<typename T> using vec = vector<T>;
template<typename T> using arr2 = array<T, 2>;

注意,与vector不同,vec有一个固定的分配器,而arr2array不同,它有一个固定的大小。

用法现在很简单:

代码语言:javascript
复制
container<int, vec> a;
container<double, arr2> b;

See the example in action.

或者,如果您希望将接口与vector使用的接口相匹配,只需为array添加一个模板别名来实例化大小,并添加一个未使用的类型参数:

代码语言:javascript
复制
template<typename T, typename> using arr2 = array<T, 2>;

See it in action.

票数 3
EN

Stack Overflow用户

发布于 2015-03-17 06:59:23

我不知道怎样才能达到你想要的效果。但是如果你不需要编写MyContainer<int> MCV;的能力,你可以使用

代码语言:javascript
复制
template<class UnderlyingContainerType, class T = typename UnderlyingContainerType::value_type>
class MyContainer
{
public:
    T Value1;
    T Value2;
    UnderlyingContainerType Container;

    MyContainer() {}

    /* methods implementation goes here */
};


int main() {
    MyContainer<std::vector<int>> MCV{};
    MyContainer<std::array<int, 5>> MCA{};
}

它并不比MyContainer<int, std::vector> MCV;更适合输入

当然,您仍然可以为基于矢量的版本添加别名:

代码语言:javascript
复制
template<class T>
using MyContainerV = MyContainer < std::vector<T> > ;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29086541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档