如何帮助模板类型推断

时间:2014-11-15 04:55:40

标签: c++ templates

我有一个抽象的基类:

template<class T>
class Iterator
{
  public:
    virtual T operator*() = 0;
    ...
};

我有一个具体的子类

template<class T,
         template<class, class> class Col,
         class Alloc = std::allocator<T>>
class StdIterator final: virtual public Iterator<T>
{
    typedef typename Col<T, Alloc>::iterator std_iterator;
    std_iterator b, e;
  public:
    StdIterator(Col<T, Alloc>);
    StdIterator(std_iterator, std_iterator);
    T operator*() const override;
    ...
};

在呼叫网站上,我的代码类似于StdIterator<int, std::vector> x (a_std_vector)。 如何将呼叫站点更改为StdIterator<std::vector<int>>> x (a_std_vector),并根据T的模板参数绑定std::vector?我仍然需要将T,Col和Alloc都绑定在班级的身体内。

除此之外,我的代码只适用于std :: vectors,而不是std :: sets等。我试图获得该功能(使用可变参数类模板),但我甚至无法获得它要编译。

1 个答案:

答案 0 :(得分:1)

标准容器有value_type typedef,因此您可以使用以下内容:

template<class C>
class StdIterator final: virtual public Iterator<typename C::value_type>
{
    typedef typename C::iterator std_iterator;
    // your stuff
};