我有一个抽象的基类:
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等。我试图获得该功能(使用可变参数类模板),但我甚至无法获得它要编译。
答案 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
};