我有一个抽象基类:
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)
, 并让它绑定(bind) T
基于 std::vector
的模板参数?我仍然需要将 T、Col 和 Alloc 全部绑定(bind)在类的体内。
除此之外,我拥有的代码仅适用于 std::vectors,不适用于 std::sets 等。我试图获得该功能(使用可变参数类模板),但我什至无法获得它进行编译。
最佳答案
标准容器有 value_type
typedef,所以你可以使用类似的东西:
template<class C>
class StdIterator final: virtual public Iterator<typename C::value_type>
{
typedef typename C::iterator std_iterator;
// your stuff
};
关于c++ - 如何帮助模板类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942696/