2

我需要编写一个容器模板类<T, R>,其中 T 是一个对象,R 可以是vector<T*>or list<T*>。我需要支持像 insert(T) size() 等常见操作...

我持有一个名为T data列表或向量的类成员。问题是,我如何编写代码,以便在运行时我知道从哪个操作调用std::liststd::vector

例如,要获取容器中的第一个元素,我必须data[0]在向量情况和data.front()列表情况下调用。我应该只使用typeid运算符吗?

if (typeid(R) ==  typeid(vector<T*>))
  then ...
else if (typeid(R) == typeid(list<T*>))
 then ...

或者,还有更好的方法 ?

4

4 回答 4

4

您应该使用模板专业化。你可以在这里阅读一篇关于它的好文章。

于 2012-05-22T12:12:05.917 回答
2

您可以使用迭代器——它们是 STL 中的标准习惯用法。用于begin()获取指向集合开头的迭代器并end()获取结尾(更准确地说,指向集合中最后一个元素“之后”的迭代器)。您还可以同时使用push_back()list<>vector<>元素添加到集合的末尾,将insert()元素添加到特定位置以及erase从集合中删除元素。查看参考(矢量列表)以了解更常见的功能。

这个想法是模板中的方法调用直到实例化点才被检查(特别是直到模板函数的调用),因此上述调用将绑定到您在模板中指定的确切集合类型

于 2012-05-22T12:13:19.560 回答
0

如果集合是如此有限,您可以执行以下操作:

#include <vector>
#include <list>
using namespace std;

template < typename T, typename V >
class X;

class XImpl {};

template < typename T >
class X< T, vector<T*> > : XImpl {};


template < typename T >
class X< T, list<T*> > : XImpl {};

int main()
{
    X< int,vector<int*> > a;
    X< double, list<double*> > b;
    X<int, int> c; // error
}

并将您的实现放入XImpl.

编辑: XImpl 也很可能被模板化。这段代码只是演示了对除向量或列表之外的任何其他容器的防护。当然,还要提防像X<int, vector<double*> >.

于 2012-05-22T12:14:22.150 回答
0

答案是 mfontanini 给出的,使用专业化。不过,对于您的具体示例,vector 也支持 front ,并且 vector 和 list 尽可能具有相同的功能

于 2012-05-22T12:14:30.887 回答