如果您确实希望能够声明仅与容器中包含的数据类型相关的模板,并且您希望能够将任何类型的迭代器(即迭代器)存储到任何类型的容器),解决方案是在迭代器上执行类型擦除。
如果您可以将一些外部库引入到adobe库中,如any_iterator
。基本上你定义一个基类定义,你需要用动态的多态性(即虚拟方法)的迭代器接口,然后实现与采取适当类型的模板界面:
template <typename T>
struct any_iterator {
// all typedefs for an iterator here, including:
typedef T value_type;
virtual ~any_iterator() {}
virtual any_iterator& operator++() = 0;
virtual value_type& operator*() = 0;
// ... rest of the methods
};
template <typename Iterator>
class any_iterator_impl : any_iterator< typename Iterator::value_type > {
iterator it;
public:
// all the typedefs
typedef Iterator iterator;
typedef typename iterator::value_type value_type;
// actual implementation of the interface
any_iterator_impl(Iterator it) : it(it) {}
virtual any_iterator_impl& operator++() { ++it; return *this; }
virtual value_type& operator*() { return *it; }
// ... and all the rest of the interface
};
,然后用它在你的类:
template <typename T>
class Foo {
std::unique_ptr<any_iterator> it, end; // in real code use smart pointers here
public:
template <typename Iterator>
Foo(Iterator b, Iterator e) {
static_assert(is_same< typename Iterator::value_type, T>::value);
it = new any_iterator_impl<Iterator>(begin);
end = new any_iterator_impl<Iterator>(end);
}
// rest of the class
};
的代码片段只用于展览,他们不是生产代码,没有被编译,并有相当数量的不做的(裸指针,迭代器可以成为在任何时候无效在对象的生命周期中...),但是打算给y ou一个想法,你需要在迭代器上执行类型擦除。然后,再看看链接的adobe库,以获得更深思熟虑的提议。
如果您对此感到好奇,则采用与std::function
或boost::any
相同的方法。其中一个优点是,您可以在不同情况下使用不同系列的迭代器实际使用相同的Foo
类。另一方面,它需要动态调度,但在大多数情况下这应该不成问题。
@samadhi:是*什么*可能没有复制容器的数据? – phooji 2011-04-20 19:19:47
就像我在你的最后一个问题中问的那样:为什么?什么是随机限制来编写异端代码?无论如何,你想要类型擦除。 – GManNickG 2011-04-20 19:21:07
我不明白..您想做什么? – 2011-04-20 19:21:14