typedef'd STL容器类型作为模板参数

时间:2014-06-17 22:05:18

标签: c++ templates stl

我想知道是否可以使用typedef' d容器作为模板参数。我正在尝试以下内容:

template<typename T>
using containerT = std::vector<T>;

template <template<class T, class = std::allocator<T> > class container_type = containerT >
struct nodeData {
    container_type<int> param;
};

int main()
{    
    nodeData<> nd;
}

这导致GCC 4.8的编译错误:

  

需要一个类型为&#39;模板类的模板   container_type&#39;,使用containerT =得到模板   的std ::矢量&lt; T&gt;&#39;

有人知道这样做的方法吗?

由于

2 个答案:

答案 0 :(得分:3)

containerT只有一个模板参数,因此模板模板参数必须匹配:

template <template<class> class container_type = containerT >

但是,我怀疑你希望能够将标准容器作为模板参数,所以你想要这样:

template<class T, class Allocator = std::allocator<T>>
using containerT = std::vector<T, Allocator>;

现在,您可以使用containerT作为您在问题中提供的函数模板的模板参数。

答案 1 :(得分:0)

您可以将模板包装在一个类型中,从而延迟其瞬时。这使得模板在元编程世界中成为一流的公民:

template<template<typename...> class T>
struct wrapper
{
    template<typename... ARGS>
    using instance = T<ARGS...>;
};

template<typename WRAPPER , typename... ARGS>
using instance = typename WRAPPER::template instance<ARGS...>;

现在您可以将包装器用作类型可选模板参数:

using container_type = wrapper<std::vector>;

template <typename CONTAINER = container_type>
struct nodeData {
    instance<CONTAINER,int> param;
};

现在您的用例完美无缺:

int main()
{
    nodeData<> node;
}